[英]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();
}
這是另一個版本的用法,我認為對於初學者來說可以更容易理解
您需要在類中定義信號和插槽。 添加到類的標題中,例如,發送給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.