[英]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.