qt窗口之间如何通信或信息共享?(C++版)

在逛知乎的时候,看到的这篇帖子,奈何里面的代码都是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.多窗口数据传输:自定义信号与槽

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Qt窗口主线程通信是指在Qt程序中,窗口所在的主线程与其它线程通信的过程。Qt程序中通常会包含多个线程,而窗口往往位于主线程中,主要负责界面的更新和用户输入响应等任务。如果其它线程需要与窗口进行通信,便需要进行线程间通信(Inter-Thread Communication)。 Qt提供了多种线程间通信的方式,其中包括信号槽机制、事件机制和共享对象等,这些机制都可用于主线程与其它线程之间通信。其中,信号槽机制是最常用的一种方式。主线程可以在窗口中定义信号(Signal),其它线程可以在需要通知窗口时触发该信号,主线程则通过槽(Slot)来接收信号并执行相应的操作。此外,也可以通过发送事件的方式来通信,其它线程可以通过调用窗口的postEvent()函数来发送事件,主线程则通过重载窗口的event()函数来接收事件并执行相应的操作。 为了确保线程安全,Qt提供了QMutex和QReadWriteLock等线程锁(Thread-Safe Mechanisms),可以在多线程读写共享资源时保护数据的一致性,避免出现数据并发访问的问题。在使用这些机制时,需要注意不要在主线程中执行耗时的操作,以免阻塞GUI界面的更新,导致程序“假死”。 综上所述,Qt窗口主线程通信是一种重要的线程间通信方式,通过合理使用信号槽机制、事件机制和线程锁等工具,可以实现主线程和其它线程之间的高效通信,提高程序的运行效率和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yaked19

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值