使用传入阀创建多个QDialog

时间:2018-03-22 19:12:11

标签: c++ qt qdialog

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

1 个答案:

答案 0 :(得分:0)

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

...... ..所以你的所有对话框标签文字都会改为最新的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);

修改

使用Dialog创建new时,您将动态创建该对象。它将保留在内存中,除非它被明确地销毁或者它的父节点被销毁。每次创建receiveTargetEmail(QString)的实例时,您也会与Dialog建立连接。除非QDialog被销毁,否则此连接也是永久性的。

每当您发出sedTargetEmail()时,您之前创建的每个receiveTargetEmail(QString)实例的Dialog插槽都会被触发。您可以直接调用该函数,而不是与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
}