簡體   English   中英

C++ Qt 信號與槽

[英]C++ Qt Signals and Slots

我很難連接到在不同的 class 中定義的 SLOT。我有 2 個類 - Computations 和 MainWindow。 MainWindow 應該只處理程序的 GUI 部分,而 Computations 處理計算。 我正在創建一個計算器。

基本上,我想了解如何從 MainWindow Class 連接到 Computations Class 中的 SLOT。

我想您已經檢查了Qt Signals&Slots頁面 要實現您想要的內容,您需要在另一個實例中擁有您的類的一個實例。

因此,例如在您的MainWindow類中,您可以包括Computations類並為其創建一個成員變量:

#include "computations.h"

class MainWindow : public QMainWindow
{
   Q_ObBJECT
public:
   //..
private:
   Computations *_computation;
};

然后在初始化_computation對象( _computation = new Computations(); )后在MainWindow的構造函數中進行如下連接(適用於Qt5):

QObject::connect(_computation, &Computations::somethingHappened, this, &MainWindow::doSomeGuiStuff);
QObject::connect(this, &MainWindow::guiThingHappened, _computation, &Computations::doSomeComputation);

取決於應該走哪條路。

我希望這有幫助。

這樣的連接屬於UI和控制器(計算對象)都可用的級別。 因此,無論是在main ,還是在較高層次上組成應用程序各種元素的類中(盡管此類通常通常不應源自QApplication )。

如果UI類知道計算對象的存在或以某種方式與其詳細信息聯系在一起,則幾乎總是太過緊密。 我通常將UI設計為具有一個由信號和插槽組成的接口,該接口和插槽在實際可行的情況下具有一般性質,然后通過信號/插槽連接將其綁定到一個或多個控制器對象。 我還利用屬性系統以通用的方式公開與UI相關的屬性,通常使用viewmodel對象將與UI無關的控制器與特定類型的UI接口。

在您的情況下,建議不要讓MainWindow知道Computations ,反之亦然:

int main(int argc, char *argv[]) {
  QApplication app(argc, argv);
  Computations comp;
  MainWindow ui;
  QObject::connect(&comp, ..., &ui, ...);
  /* more connections here */
  ui.show();
  return app.exec();
}

有關更多具體示例,請參見答案1答案2

這是另一個版本的用法,我認為對於初學者來說可以更容易理解

您需要在類中定義信號和插槽。 添加到類的標題中,例如,發送給MainWindow的信號,發送給Computations的插槽

public slots:
    void something();

signals:
    void something_happend();

然后,在任何要使用它的地方,在mainwindow.cpp的示例中,您都需要連接信號和插槽。 通過QObject :: connect做到這一點:

QObject::connect(who_emit,SIGNAL(what_signal),who_receive,SLOT(what_slot))

例:

主窗口

signals:
    void something_happend();

計算.h

public slots:
    void something_happend();

主窗口

Computations *c = new Computations(this);
QObject::connect(this,SIGNAL(something_happend()),c,SLOT(something()));

如果要傳遞一些參數,則要連接的SIGNAL和SLOT需要具有相同類型的參數:

public slots:
    void something(int c);

signals:
    void something_happend(int c);

QObject::connect(this,SIGNAL(something_happend(int)),c,SLOT(something(int)));

你需要插槽和信號,因為它們一起工作,就像這樣:你的 file.h

public slots:
    void start();

signals:
    void levelChanged(int level);

實施:

void MainBoard::start()
{
    isStarted = true;
    clearBoard();
    emit levelChanged(1);

}

現在你需要鏈接一個按鈕

startButton = new QPushButton(tr("&Start"));
startButton->setFocusPolicy(Qt::NoFocus);

connect(startButton, &QPushButton::clicked, board, &MainBoard::start);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM