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

Posted yaked

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.多窗口数据传输:自定义信号与槽

以上是关于qt窗口之间如何通信或信息共享?(C++版)的主要内容,如果未能解决你的问题,请参考以下文章

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

用于 WebGL 的 C++ 和 Javascript 之间的通信

进程的通信:共享存储消息传递和管道通信

如何在 C# 和 C++ 代码之间共享常量?

在 QT 中的两个窗口之间共享 websocket 连接

在 C++ 和 C# 或 VB 之间共享数据(2 个运行程序)