2017-05-20 4 views
0

クラスMainWindowには、独自のヘッダーと他のメンバーを持つQWidgetTablesがいくつか含まれています。今のところ、私はかなり簡単なので、クラスMainWindowの中にカスタムテーブルクラスを定義したいと思います。私はworkflow_tableのための行を追加し、削除するQPushButtonsを持ってUi::MainWindowQt:QObjectクラス内で定義されたクラスのスロットを接続します。

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; 
}; 

:以下の例を参照してください。このQPushButton::clicked信号を MainWindow::Workflow_Table::addRowに接続したいと思いますが、私は何の成功もせず、私が試していることが可能かどうかも分かりません。

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)); 

} 

それは私がメインウィンドウからQPushButton::clicked信号に(Workflow_Table QObjectをせずに)MainWindow::Workflow_Table::addRowを接続できることは可能ですか?

Workflow_TableをQObjectにするのは簡単な解決策ですが、Workflow_Tableの関数はQObjectのスコープの下で定義されているため、接続できるかどうか不思議です。私はCTL::saveas関数のようにstd :: bindを使って他の非スロット関数を接続することができましたので、ここで同様のことができると思います。私はまた、とpublic slotsアクセス指定子の下でWorkflow_Tableを移動しようとしましたが、いずれも動作していません。

+1

最も簡単な方法は、 'のAddRow()')(onPushButton_clicked ''内部を置くことです。メタオブジェクトシステムを使用することは、単に行をクリックしたり追加したりするための非常に難しいことです。 – codekaizer

答えて

-1

すべてが動作します。実際の完全な例が表示されない場合は、あなたの責任ではありません。私が空のプロジェクトに貼り付けると、2番目のconnectを除いてすべてがコンパイルされます。std::bindまたはラムダを使用して、addRow()が動作するようにしなければなりません。

ラムダが短い場合は一般的にはbindを使用するのは無意味です。したがって、コードの明瞭度が上がる場合はlambdaを使用してください。

これは動作します:

// 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" 
関連する問題