如何将 Qdialog 中的信号连接到 QMainwindow 中的插槽

Posted

技术标签:

【中文标题】如何将 Qdialog 中的信号连接到 QMainwindow 中的插槽【英文标题】:How to connect a signal in Qdialog to a slot in QMainwindow 【发布时间】:2019-07-04 06:43:59 【问题描述】:

我使用 QT Creator 4.9.1 并与设计师一起制作了 gui。我有一个带有stackedWidget 和大约60 页的MainWindow,在我的主窗口内我有一个按钮,带有onButton_clicked 信号我打开一个对话框(显示图片)以插入一个数字来设置用户想要在里面看到的页面主窗口。

我的问题是 SIGNAL 来自名为 on_pushButton_Enter_clicked 的对话框,而我的 SLOT 位于我的主窗口中,名称为 setCurrentIndex()。我已经阅读了帖子:“如何将信号从主窗口连接到对话框中的插槽”和“Qt 使用信号和插槽连接主窗口和对话框”。

但这对我没有帮助,因为我的对话框不知道我的主窗口,我不知道如何连接它们。

信号:

Dialognummer_eingeben.h
...
signals:
    void enterButtonPressed();
...


void Dialognummer_eingeben::on_pushButton_Enter_clicked()

  QString text = ui->lineEdit_Dialognummer->text();
  ui->lineEdit_Dialognummer->setText("");
  this->reject();
  emit enterButtonPressed();

插槽:

Terminal::Terminal(QWidget *parent) : QMainWindow(parent), ui(new Ui::Terminal)

  ui->setupUi(this);
  QObject::connect(&dialog, SIGNAL(enterButtonPressed()), this, SLOT(setCurrentIndex()));


void Terminal::setCurrentIndex()

  int num = dianr.getNum();
  QString strNum = QString::number(num);
  switch(num)
   
    ....
  

编辑:1.添加信号和槽代码 2. 对代码进行一些修改

【问题讨论】:

您可以从任何您想要的地方拨打connect。因此,如果您的“对话框不知道您的主窗口”,那么只需调用 connect 某个您“知道”主窗口和对话框的地方。或者您可以将主窗口传递给对话框或将其作为父窗口。 【参考方案1】:

在我的主窗口中,我有一个按钮,使用 onButton_clicked 信号我打开一个对话框(显示图片)以插入一个数字来设置用户希望在主窗口中看到的页面。

您必须在对话框类中另外添加一个信号,一旦按下回车按钮就应该发出该信号,使用 on_pushButton_Enter_clicked 作为函数是不够的。在对话框类中添加一个信号,例如“enterButtonPressed()”,并在函数on_pushButton_Enter_clicked 中发出它。

在主窗口内(在创建对话框的某个位置)添加这一行:

connect(dialog, SIGNAL(enterButtonPressed()), this, SLOT(SlotNameWhichShouldGetCalled()));

编辑:即使上述解决方案应该有效,我也想到了一个更好的解决方案。 您通常应该使用 QDialog::accepted 信号来连接(请参阅https://doc.qt.io/archives/qt-4.8/qdialog.html#accept)。

具体步骤:

    在代码底部的on_pushButton_Enter_clicked() 中添加accept() 而不是this-reject()(我假设您希望对话框成功关闭而不是被拒绝?)

    通过添加连接到 QDialog::accepted() 信号

    QObject::connect(&dialog, SIGNAL(accepted()), this, SLOT(setCurrentIndex()));
    

另外确保您在 connect(...) 函数中没有错误。如果未找到信号/插槽或不匹配,您应该在 Qt Creator 的应用程序输出中看到一些内容

【讨论】:

您好,我做了一些更改,但它不起作用,您看到我做错了什么吗?我已经添加了我所做的所有更改。 你为什么用这个->reject(); ?如果这不是故意的,请将 this->reject() 更改为 accept() 并使用 QDialog::accepted 信号而不是我建议的新自定义信号。否则我真的不明白它应该如何工作。在 connect(...) 时,您的对话框被评估为 QDialog 还是 Dialognummer_eingeben ? xD 对不起,我失败了,我没有将 setCurrentIndex 设置为 SLOT

以上是关于如何将 Qdialog 中的信号连接到 QMainwindow 中的插槽的主要内容,如果未能解决你的问题,请参考以下文章

如何将信号连接到不同线程中的插槽

Qt:如何将不同类的静态信号连接到插槽?

如何将鼠标点击信号连接到 pyqtgraph 绘图小部件

无法将信号连接到 main() 中的函数

将数组连接到 Qt 中的信号槽机制

如何将信号连接到插槽