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