繁体   English   中英

如何使用 QT Designer 和 Visual Studio 连接 Qt 信号和槽

[英]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();

现在在我的脑海里我想:

  1. 信号clicked()已经由 Qt 魔法实现
  2. 该插槽已由我实施
  3. Qt 设计师已将它们连接到某处

所以对我来说这应该有效。 任何想法为什么没有?

你必须手动连接它们..

connect(ui->button, &QPushButton::clicked, yourGlPointer, &OGLWidget::populate_mesh_from_obj);

幸运的是,接受的答案是不正确的(并不是说它不能手动工作,而是你不必那样做)。

事实上,QT 会自动将信号连接到所有遵循标准命名约定的插槽。

这个插槽的命名约定是这样的:

void on_<object name>_<signal name>(<signal parameters>);

在您的情况下,这意味着如果您在 QT Designer 中创建QPushButton ,如下所示:

QPushButton 加载文件

object nameloadfile ,信号名称为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM