[英]How to connect Qt signals and slots using QT Designer and Visual Studio
我正在使用 Qt Designer 設計我的應用程序,其中包含一個“加載文件” QPushButton
(已提升為自定義loadfile.h
)以及一個 QOpenGLWidget(已提升為自定義OGLWidget.h
)。
我想要它,這樣當我單擊“加載文件”按鈕時,它會向我的OGLWidget
class 中的一個插槽發送一個信號,它會彈出一個對話框並加載文件。
我首先在 Qt Designer 中進入信號/插槽編輯模式,並將按鈕連接到openglwidget
,並將clicked()
作為信號和新添加的(從 Qt Designer 中) populate_mesh_from_obj()
。
然后我做了一個 function:
void OGLWidget::populate_mesh_from_obj()
{
exit(0);
}
作為測試,在 header 中輸入:
public slots:
void populate_mesh_from_obj();
現在在我的腦海里我想:
clicked()
已經由 Qt 魔法實現所以對我來說這應該有效。 任何想法為什么沒有?
你必須手動連接它們..
connect(ui->button, &QPushButton::clicked, yourGlPointer, &OGLWidget::populate_mesh_from_obj);
幸運的是,接受的答案是不正確的(並不是說它不能手動工作,而是你不必那樣做)。
事實上,QT 會自動將信號連接到所有遵循標准命名約定的插槽。
這個插槽的命名約定是這樣的:
void on_<object name>_<signal name>(<signal parameters>);
在您的情況下,這意味着如果您在 QT Designer 中創建QPushButton
,如下所示:
object name
為loadfile
,信號名稱為clicked
。
現在,在 header 中像這樣聲明您的 function:
public slots:
void on_loadfile_clicked();
並在 cpp 中這樣定義它:
void OGLWidget::on_loadfile_clicked()
{
exit(0);
}
連接將自動處理。
這種自動連接功能實際上是通過 QT 元對象編譯器實現的。 您可以通過打開由 QT Designer 生成的ui_<classname>.h
文件來追溯發生的情況。 它將包含一個 function void setupUi(<QClassName> *<YourClassName>)
包含一行QMetaObject::connectSlotsByName(<YourClassName>);
. 這就是指示 QTs 元對象編譯器為您實現連接的內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.