在逛知乎的时候,看到的这篇帖子,奈何里面的代码都是python版的,博主的三个例子看完,刚好有时候也遇到这个问题,今天仔细整理总结一次。原文python版的在这里:qt窗口之间如何通信或信息共享?
1. 单一窗口通过信号槽传递信息
单一窗口的程序来说,利用信号与槽机制来传递信息较为方便。
Qt学习(一)简单界面_Learning by doing-CSDN博客_qt界面
2.多窗口数据传输:调用属性
在主窗口中调用对话框有两种方法,单击“弹出对话框"按钮,在对话框的时间日期控件中选择日期,则会把所选中的日期返回到主窗口的lineText文本框控件中。
使用两个按钮(Ok和Cancel)分别连接accept()和reject()槽函数。在类中定义一个静态函数getDateTime(),该静态函数返回3个时间值。原理是利用静态函数的特性,在静态函数中实例化 DateDialog 类,并调用dialog.exec()函数来显式执行对话框。通过 dialog.exec()的返回值来判断用户单击的是Ok按钮还是Cancel按钮,然后做出下一步判断。
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
mydialog = new Dialog(this);
int result = mydialog->exec();
QString x, y, z, a, b, c;
std::tuple<QString, QString, QString, QString, QString, QString> mydatetime= mydialog->dateTime();
mydialog->close();
// qDebug()<<result;
if (result== QDialog::Accepted)
{
ui->lineEdit->setText(std::get<0>(mydatetime) + std::get<1>(mydatetime) + std::get<2>(mydatetime) + std::get<3>(mydatetime)+ std::get<4>(mydatetime)+std::get<5>(mydatetime) );
qDebug()<<"Press OK";
}
else
{
ui->lineEdit->clear();
qDebug()<<"Press Cancel";
}
}
void MainWindow::on_pushButton_2_clicked()
{
std::tuple<QString, QString, QString, QString, QString, QString, int> datetime = Dialog::static_MyDatetime();// 这里直接由静态函数返回dialog里是按下了哪一个
if (std::get<6>(datetime) == QDialog::Accepted)
{
qDebug()<<"Press OK";
ui->lineEdit->setText(std::get<0>(datetime) + std::get<1>(datetime) + std::get<2>(datetime) + std::get<3>(datetime)+ std::get<4>(datetime)+std::get<5>(datetime) );
}
else
{
ui->lineEdit->clear();
qDebug()<<"Press Cancel";
}
}
第一个按钮的槽函数与下面按钮2的槽函数的区别是dialog的实例化是放在槽函数里,后面那个是放在调用的静态成员函数里。
C++函数返回多个返回值。std::tuple
静态成员函数实例化本类。
Dialog* yakeDialog = new Dialog();
int result = yakeDialog->exec();
对话框窗口实现代码如下所示:?
#include "dialog.h"
#include "ui_dialog.h"
std::tuple<QString, QString, QString, QString, QString, QString, int> Dialog::static_MyDatetime()
{
Dialog* yakeDialog = new Dialog();
int result = yakeDialog->exec();
auto [x, y, z, a, b, c] = yakeDialog->dateTime();// Call function and return.
return { x, y, z, a, b, c, result};
}
std::tuple<QString, QString, QString, QString, QString, QString> Dialog::dateTime()
{
return { ui->dateTimeEdit->sectionText(QDateTimeEdit::YearSection),
ui->dateTimeEdit->sectionText(QDateTimeEdit::MonthSection),
ui->dateTimeEdit->sectionText(QDateTimeEdit::DaySection),
ui->dateTimeEdit->sectionText(QDateTimeEdit::HourSection),
ui ->dateTimeEdit->sectionText(QDateTimeEdit::MinuteSection),
ui->dateTimeEdit->sectionText(QDateTimeEdit::SecondSection)
};
}
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
this->setWindowTitle("DateDialog");
ui->dateTimeEdit->dateTime().setDate(QDate::currentDate());
ui->dateTimeEdit->dateTime().setTime(QTime::currentTime());
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::on_buttonBox_accepted()
{
// 各部分对应的值
QString strYear = ui->dateTimeEdit->sectionText(QDateTimeEdit::YearSection);
QString strMonth = ui->dateTimeEdit->sectionText(QDateTimeEdit::MonthSection);
QString strDay = ui->dateTimeEdit->sectionText(QDateTimeEdit::DaySection);
QString strHour = ui->dateTimeEdit->sectionText(QDateTimeEdit::HourSection);
QString strMinute = ui->dateTimeEdit->sectionText(QDateTimeEdit::MinuteSection);
QString strSecond = ui->dateTimeEdit->sectionText(QDateTimeEdit::SecondSection);
qDebug() << "Year : " << strYear;
qDebug() << "Month : " << strMonth;
qDebug() << "Day : " << strDay;
qDebug() << "Hour : " << strHour;
qDebug() << "Minute : " << strMinute;
qDebug() << "Second : " << strSecond;
}
void Dialog::on_buttonBox_rejected()
{
ui->dateTimeEdit->clear();
}
在静态函数中实例化本 Dialog 类,并调用dialog.exec()函数来显式执行对话框。通过 dialog.exec()的返回值来判断用户单击的是Ok按钮还是Cancel按钮,然后做出下一步判断。
3.多窗口数据传输:自定义信号与槽
|