创建多个带有通过阀的QDialog

Create Multiple QDialog with pass in valve

本文关键字:QDialog 创建      更新时间:2023-10-16

我有一个主窗口,它可以从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
}