gpt4 book ai didi

c++ - 使用传入阀创建多个 QDialog

转载 作者:太空宇宙 更新时间:2023-11-04 12:50:09 26 4
gpt4 key购买 nike

我有一个主窗口,它可以从 MySQL 进行一些搜索,例如。如果我输入“abc”,它会搜索所有包含“abc”的邮件,然后它将所有结果插入 QTableWidget 并显示它,如果我双击其中任何一个,它将通过 show() 创建一个 QDialog 并通过 SIGNAL/SLOT 传递我点击的电子邮件,问题是,我想在必要时创建多个 QDialog。通过双击另一封电子邮件,它应该创建另一个 QDialog,但每次我打开一个新的 QDialog,我传递的所有电子邮件都将更改为我点击的最后一封电子邮件,希望有人能教我这是怎么回事。

这是我的主窗口双击功能

void MainWindow::on_tableWidget_cellDoubleClicked(int row, int column)
{
auto resule = ui->tableWidget->item(row, 1);
Dialog* dialog = new Dialog(this);
connect(this, SIGNAL(sendTargetEmail(QString)), dialog, SLOT(receiveTargetEmail(QString)));
dialog->show();
emit sendTargetEmail(resule->text());
}

这是我的 QDialog 函数

Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog){


ui->setupUi(this);

label1 = new QLabel("Email:", this);
label1->setGeometry(10, 30, 50, 20);

emailLabel = new QLabel(this);
emailLabel->setGeometry(60, 30, 160, 20);
}

void Dialog::receiveTargetEmail(QString email){
m_email = email ;
emailLabel->setText(m_email);
}

最佳答案

所有对话实例都会受到连接的信号/槽的影响,槽也会为所有以前创建的对话调用。

... .. 所以您所有的对话框标签文本都将更改为最新的 email 字符串!

如果由于某种原因想保持信号/槽连接,那么就不要使用槽来设置标签文本,可以直接给实例设置文本:

Dialog* dialog = new Dialog(this);
connect(this, SIGNAL(sendTargetEmail(QString)), dialog, SLOT(receiveTargetEmail(QString)));
dialog->emailLabel->setText(resule);
dialog->show();
emit sendTargetEmail(resule);

并从你的插槽中删除这一行:

emailLabel->setText(m_email);

编辑

当您使用 new 创建一个 Dialog 时,您是在动态创建该对象。它将保留在内存中,除非它被显式销毁或者当它的父级被销毁时。每次创建 Dialog 的实例时,您也会连接到 receiveTargetEmail(QString)。此连接也是永久性的,除非 QDialog 被销毁。

每当您发出 sedTargetEmail() 时,您之前创建的每个 Dialog 实例的 receiveTargetEmail(QString) 槽都会被触发。您可以直接调用该函数,而不是与 SIGNAL/SLOT 建立连接。这将确保只有您创建的最后一个 QDialog 正在接收文本。

void MainWindow::on_tableWidget_cellDoubleClicked(int row, int column)
{
auto resule = ui->tableWidget->item(row, 1);
Dialog* dialog = new Dialog(this);
dialog->receiveTargetEmail(resule->text());
dialog->show();
emit sendTargetEmail(resule->text()); //you may have other things planned for the signal so you can leave it as is, depending on your design
}

关于c++ - 使用传入阀创建多个 QDialog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49436674/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com