3

プロジェクトの 1 つのクラスに問題があります。クリックすると、QTableWidget と QPushButton を含む新しいウィンドウが表示されます。ボタンをクリックすると、stdout で「テスト」する必要がありますが、何も表示されません。このコードの一部を次に示します。

ヘッダ:

class ClientsSelector : public QWidget {
Q_OBJECT

public:
ClientsSelector(InvoiceTab* parent);
QWidget *window;

private:
QPushButton *accept;

public slots:
void loadData();

コンストラクタ:

window = new QWidget();
layout = new QGridLayout();
layout->addWidget(table, 0, 0);

/*code*/

accept = new QPushButton(QString::fromUtf8("Load data"));
connect(accept, SIGNAL(clicked()), this, SLOT(loadData()));
layout->addWidget(accept, 0, 1);

/*code*/

window->setLayout(layout);

window->show();

方法:

void ClientsSelector::loadData() {

QTextStream std(stdout);
std << "test" << endl;

}

警告もエラーも1つもありません。ボタンが間違ったオブジェクトに接続されているようです (?)

4

3 に答える 3

1

どのようにインスタンス化しますClientsSelectorか? ひょっとしてシングルトンかグローバル変数じゃないの?コンストラクターconnectの後に呼び出される別の init 関数への呼び出しを移動してみてください。ClientsSelector同様のWTF状況で私を助けてくれました。これは、各 QObject 継承者に静的なメタデータ メンバーがあり、コンストラクターが終了するまで完全に初期化される時期を確認できないという事実と関係があります。connectそのメタデータなしでは機能しません。

ここで例を参照してください: http://www.qtcentre.org/threads/9479-connect-in-constructor

それでも紛失した場合は、このチェックリストを確認してください。Qt シグナルは非常に使いやすいため、いくつかの要件があることを誰もが忘れがちです。

于 2012-09-13T13:50:38.963 に答える
0

以下を実行して、接続が確立され、スロットが呼び出されたことを確認できます。

  1. connect 関数は、接続のステータスを返します。正しく接続されているか確認してください。
  2. ブレークポイントを配置し、ボタンが押されたときに loadData() が呼び出されるかどうかを確認します。

これは、原因を見つけるのに役立つ場合があります。

于 2012-09-14T05:33:02.243 に答える
0

テスト印刷の最後に " を忘れたようです。

使ってみて

qDebug() << "test";

QTextstreamの代わりに

于 2012-09-13T10:35:14.820 に答える