2017-05-20 2 views
0

Ich habe Klasse MainWindow, die mehrere QWidgetTables mit ihren eigenen Headern und anderen Mitgliedern enthalten wird. Für den Moment möchte ich benutzerdefinierte Tabellenklassen innerhalb der Klasse MainWindow definieren, weil sie ziemlich einfach sind. Siehe Beispiel unten:Qt: Connect-Slot für eine Klasse innerhalb einer QObject-Klasse

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 
public: 
    explicit MainWindow(SSHClient &client, QWidget *parent = 0); 

public slots: 
    struct Workflow_Table { 
     QTableWidget* widget; 
     QStandardItemModel model; 
     QStringList headers; 

     void addRow(){} 
     void removeRow(){} 
    } workflow_table; 


private: 
    SSHClient& client; 
    Ui::MainWindow* ui; 

    CTL ctl; 
}; 

Innerhalb Ui::MainWindow ich QPushButtons muss hinzufügen und entfernen Sie Zeilen für workflow_table. Ich möchte diese QPushButton::clicked Signale an MainWindow::Workflow_Table::addRow anschließen, aber ich hatte keinen Erfolg, noch weiß ich, ob das, was ich versuche, sogar möglich ist.

MainWindow::MainWindow(SSHClient &client, QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow), 
    client(client) 
{ 
    ui->setupUi(this); 

    //class CTL is a not a QObject class, yet std::bind causes it to act like a slot here. This statement compiles and runs fine. 
    connect(ui->button_load_ctl, &QPushButton::clicked, this, std::bind(&CTL::saveas, &ctl, "saved.ctl")); 

    //Error: 3 Arguments provided - 4 Expected. I'm almost certain this won't work. 
    connect(ui->button_add, &QPushButton::clicked, this, &MainWindow::Workflow_Table::addRow); 

    //Error: Not a signal or slot declaration. Not sure why this isn't working. 
    connect(ui->button_add, &QPushButton::clicked, this, std::bind(&MainWindow::Workflow_Table::addRow, &workflow_table)); 

    //This doesn't work either. Error 1. 
    connect(ui->button_add, &QPushButton::clicked, this, std::bind(&Workflow_Table::addRow, &workflow_table)); 

} 

Ist es möglich, dass ich MainWindow::Workflow_Table::addRow (ohne dass Workflow_Table ein QObject) zu einem QPushButton::clicked Signal von Mainwindow herstellen kann?

Die einfache Lösung ist Workflow_Table ein QObject zu machen, aber ich bin neugierig, wenn ich noch die Funktionen der Workflow_Table verbinden kann, da sie im Rahmen eines QObjects definiert sind. Ich konnte andere non-slot Funktionen verbinden, indem ich std :: bind wie die CTL::saveas Funktion benutzte, also würde ich denken, dass ich etwas Ähnliches hier tun kann. Ich habe auch versucht, Workflow_Table unter den public und public slots Zugriffsspezifizierer zu bewegen, aber keiner hat funktioniert.

+1

der einfachste Weg ist 'addRow()' 'innen onPushButton_clicked()' zu setzen. Die Verwendung des Meta-Objekt-Systems ist ein ziemlicher Overkill für das Klicken und Hinzufügen von Zeilen. – codekaizer

Antwort

-1

Es funktioniert alles - es ist Ihre Schuld, wenn Sie kein vollständiges Beispiel zeigen, das fehlschlägt. Wenn ich es in ein leeres Projekt einfüge, kompiliert alles außer dem zweiten connect, da muss man std::bind oder ein Lambda verwenden, damit das addRow() etwas zum arbeiten hat.

Im Allgemeinen ist es sinnlos, bind zu verwenden, wenn der Lambda-Wert kürzer wäre. Verwenden Sie einfach Lambdas, wenn die Klarheit des Codes davon profitiert.

Dies funktioniert:

// https://github.com/KubaO/stackoverflown/tree/master/questions/connect-bind-44081724 
#include <QtWidgets> 
#include <functional> 

class Class : public QWidget 
{ 
    Q_OBJECT 
    QPushButton button; 
    struct CTL { 
     void saveas(const QString &); 
    } ctl; 
    struct Workflow_Table { 
     void addRow() {} 
    } workflow_table; 

public: 
    Class() { 
     connect(&button, &QPushButton::clicked, this, std::bind(&CTL::saveas, &ctl, "saved.ctl")); 
     connect(&button, &QPushButton::clicked, this, [this]{ workflow_table.addRow(); }); 
     connect(&button, &QPushButton::clicked, this, std::bind(&Workflow_Table::addRow, &workflow_table)); 

     // better yet 
     connect(&button, &QPushButton::clicked, this, [this]{ ctl.saveas("saved.ctl"); }); 
     connect(&button, &QPushButton::clicked, this, [this]{ workflow_table.addRow(); }); 

     // or simply, if we know that `this` will outlive `button` (they do by design here), 
     // and that both button and this live in the same thread (again, they do by design here) 
     connect(&button, &QPushButton::clicked, [this]{ ctl.saveas("saved.ctl"); }); 
     connect(&button, &QPushButton::clicked, [this]{ workflow_table.addRow(); }); 
    } 
}; 

int main() {} 
#include "main.moc" 
Verwandte Themen