如何将 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 中的插槽的主要内容,如果未能解决你的问题,请参考以下文章