0

Qt の onClick 処理に少し混乱しています。次のようなクラスがあります。

class DatabaseManager : public QObject
{
Q_OBJECT;
private:
    QSqlDatabase db;

public slots: 
    bool openDB(const QString& path);

};

そして、ボタンのクリックを処理するクラスがあります:

Click::Click(QWidget *parent) : QWidget(parent){
    QPushButton *create = new QPushButton("Create database", this);
    create->setGeometry(50,100,100,100);
    connect(create, SIGNAL(clicked()), this, SLOT(openDB("/home/peter/database.db")));
}

main.cpp

int main(int argc,char **argv){
    QApplication *app = new QApplication(argc, argv);
    QPushButton btn;

    DatabaseManager db;
    btn.move(300,300);
    btn.resize(250,250);
    btn.setWindowTitle("Dibli");
    btn.show();
    return app->exec();
}

特定の DatabaseManager オブジェクトの openDB 関数を使用したいことを、クリック ハンドラーにどのように伝えることができますか? クリックしてもファイルが作成されないためです。

コードを更新しました。

4

2 に答える 2

1

Click クラスが QObject から派生すると仮定すると、スロットを追加する必要があります

public slots:
 void onClick() { openDB("/home/peter/database.db"); }

そしてそれを接続します:

connect(create, SIGNAL(clicked()), this, SLOT(onClick()))

編集より多くのコードを表示するようになったので、別のヒントを示します。メインライクを変更

int main(int argc,char **argv){
    QApplication *app = new QApplication(argc, argv);
    QPushButton btn;

    DatabaseManager db;
    db.path = "/home/peter/database.db";
    QObject::connect(&btn, SIGNAL(clicked()), &db, SLOT(openDB()));

    btn.move(300,300);
    btn.resize(250,250);
    btn.setWindowTitle("Dibli");
    btn.show();

    return app->exec();
}

class DatabaseManager : public QObject
{
Q_OBJECT;
private:
    QSqlDatabase db;

public:
    QString path;

public slots: 
    bool openDB();

};

注: DatabaseManager にメンバー変数 (db.path) を追加し、スロット openDB を変更して引数を削除しました。これは、ボタンの信号が文字列を提供できないためです。その場合、より簡単な方法は、クラスで使用できるようにすることです。

于 2013-07-27T14:07:51.313 に答える
0

connect関数呼び出しで特定の引数インスタンスを呼び出すことはできません。

connectMOC (メタ オブジェクト コンパイラ) によって処理され、マクロを持つすべてのオブジェクトにいくつかの魔法を追加しますQ_OBJECTconnect受け取る引数のみを指定する内で関数を呼び出す必要があります。(そして、それらが qt オブジェクトでない場合は、それらを登録する必要がありますがqRegisterMetaType<MyDataType>("MyDataType");、これは別の話です)。

そのため、呼び出すたびに次のことを覚えておいてください。

connect(sender, SIGNAL( event() ),
        receiver, SLOT( onEvent() ))

その後:

void onEvent() {
    mycomplexoperation( ... )
}

編集:

Riateche のコメントのおかげで、このリストに記載されていないすべてのオブジェクトが必要であることを指定する必要がありqRegisterMetaType<MyDataType>("MyDataType");ます。から継承されませんが、登録なしでシグナル/スロット システムで使用できます。Frank Osterfeldのコメントのおかげで、キューに入れられたシグナル/スロット接続の場合にのみ登録が必要であることを追加する必要があります (私はそれを知りませんでした)。QStringQObject

に感謝

于 2013-07-27T14:28:30.373 に答える