欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Qt5--多窗口编程实例

程序员文章站 2022-05-28 11:36:01
...
  • 登录后进入主窗口
  • 主窗口打开对话框(自带的类无ui文件)
  • 主窗口打开其他窗口(自定义的类+ui)
  • 主窗口打开其他窗口并通信 (自定义的类+ui)

登录后进入主窗口

1、新建工程

(1)Crtl + N 新建工程

Qt5--多窗口编程实例

(2)取名window工程

Qt5--多窗口编程实例

Qt5--多窗口编程实例

Qt5--多窗口编程实例

Qt5--多窗口编程实例

2、往工程里面添加自定义类和ui文件

(1)在工程名字上面点击“Add New ….”

Qt5--多窗口编程实例

(2)这里可以随便选择,我选Dialog without Buttons。

Qt5--多窗口编程实例

(3)修改类名

Qt5--多窗口编程实例

(4)QtCreator自动把新建的窗口类信息添加进.pro工程配置文件中去

Qt5--多窗口编程实例

(5)工程中就有了文件了

Qt5--多窗口编程实例

(6)配置文件中也自动添加了

Qt5--多窗口编程实例

(7)设计登录界面

Qt5--多窗口编程实例

(8)配置登录界面的信号与槽:鼠标点击工具栏的按键,选择clicked(),accept()然后确定。

Qt5--多窗口编程实例

3、编写代码完成首先进入登录页面,按下按钮之后进入主窗口的逻辑

(1)window.h里面添加登录视图类的头文件

Qt5--多窗口编程实例

(2)main.cpp里面添加

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    LoginDlg dlg;
    if (dlg.exec() == QDialog::Accepted){//利用Accepted返回值判断按键是否被按下

        w.show();// 如果被按下,显示主窗口

        return a.exec();// 程序一直执行,直到主窗口关闭
    }
    else return 0;//如果没有被按下,则不会进入主窗口,整个程序结束运行
}

效果如动图
Qt5--多窗口编程实例

源码下载


主窗口打开对话框

代码继续沿用前面的。

(1)在主窗口的视图界面里面添加一个按键,然后使用信号与槽,打开一个对话框。

Qt5--多窗口编程实例

Qt5--多窗口编程实例

(2)在点击实现函数下写代码打开一个对话框
首先在window.h中添加对话框的头文件QDialog

Qt5--多窗口编程实例

然后在window.cpp中的点击实现函数实例化一个对话框。

#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()
{
    QDialog *dlg = new QDialog(this);
    void MainWindow::on_pushButton_clicked()
{
    QDialog *dlg = new QDialog(this);
//    dlg->show();  // 可以连续打开多个,即父窗口可以点击
    dlg->exec();  // 父窗口不可点击
}

Qt里面还内置了很多对话框

  • QColorDialog:选择颜色;
  • QFileDialog:选择文件或者目录;
  • QFontDialog:选择字体;
  • QInputDialog:允许用户输入一个值,并将其值返回;
  • QMessageBox:模态对话框,用于显示信息、询问问题等;
  • QPageSetupDialog:为打印机提供纸张相关的选项;
  • QPrintDialog:打印机配置;
  • QPrintPreviewDialog:打印预览;
  • QProgressDialog:显示操作过程。

比如QMessageBox的使用案例:
案例一:

void MainWindow::on_pushButton_clicked()
{
//    QMessageBox *dlg = new QMessageBox(this);
    if (QMessageBox::Yes == QMessageBox::question(this,
                                                  tr("Question"),
                                                  tr("Are you OK?"),
                                                  QMessageBox::Yes | QMessageBox::No,
                                                  QMessageBox::Yes)) {
        QMessageBox::information(this, tr("Hmmm..."), tr("I'm glad to hear that!"));
    } else {
        QMessageBox::information(this, tr("Hmmm..."), tr("I'm sorry!"));
    }
}

效果:

Qt5--多窗口编程实例

案例二:

{
    QMessageBox msgBox;
    msgBox.setText(tr("The document has been modified."));
    msgBox.setInformativeText(tr("Do you want to save your changes?"));
    msgBox.setDetailedText(tr("Differences here..."));
    msgBox.setStandardButtons(QMessageBox::Save
                              | QMessageBox::Discard
                              | QMessageBox::Cancel);
    msgBox.setDefaultButton(QMessageBox::Save);
    int ret = msgBox.exec();
    switch (ret) {
    case QMessageBox::Save:
        qDebug() << "Save document!";
        break;
    case QMessageBox::Discard:
        qDebug() << "Discard changes!";
        break;
    case QMessageBox::Cancel:
        qDebug() << "Close document!";
        break;
}

效果图:

Qt5--多窗口编程实例


主窗口打开其他窗口

代码继续使用前面的。

(1)在工程里面新建一个Qt设计表单类

Qt5--多窗口编程实例

Qt5--多窗口编程实例

Qt5--多窗口编程实例

Qt5--多窗口编程实例

在新的视图页面里面添加一段文字。

Qt5--多窗口编程实例

(2)编写逻辑代码

首先还是在window.h中添加新的视图类的头文件

Qt5--多窗口编程实例

然后在主窗口的视图页面里面添加一个按钮

Qt5--多窗口编程实例

打开新建的按钮的信号与槽函数并添加代码

#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()
{
    QMessageBox msgBox;
    msgBox.setText(tr("The document has been modified."));
    msgBox.setInformativeText(tr("Do you want to save your changes?"));
    msgBox.setDetailedText(tr("Differences here..."));
    msgBox.setStandardButtons(QMessageBox::Save
                              | QMessageBox::Discard
                              | QMessageBox::Cancel);
    msgBox.setDefaultButton(QMessageBox::Save);
    int ret = msgBox.exec();
    switch (ret) {
    case QMessageBox::Save:
        qDebug() << "Save document!";
        break;
    case QMessageBox::Discard:
        qDebug() << "Discard changes!";
        break;
    case QMessageBox::Cancel:
        qDebug() << "Close document!";
        break;
    }
}

void MainWindow::on_pushButton_2_clicked()
{
    myForm *form = new myForm(this);
    form->exec();  // 打开另外一个窗口
}

效果图:
Qt5--多窗口编程实例


主窗口打开其他窗口并通信

  • 使用信号与槽
  • 子窗口向父窗口传输数据

(1)子窗口的配置

Qt5--多窗口编程实例

(2)子窗口:myform.h—-增加传输数据的信号、按键响应的槽

#ifndef MYFORM_H
#define MYFORM_H

#include <QDialog>

namespace Ui {
class myForm;
}

class myForm : public QDialog
{
    Q_OBJECT

public:
    explicit myForm(QWidget *parent = 0);
    ~myForm();

signals:
    void sendData(QString);  // 用来传输数据的信号

private slots:
    void on_pushButton_clicked();  // 按键点击

private:
    Ui::myForm *ui;
};

#endif // MYFORM_H

子窗口:myform.cpp—按键响应的实现

#include "myform.h"
#include "ui_myform.h"

myForm::myForm(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::myForm)
{
    ui->setupUi(this);
}

myForm::~myForm()
{
    delete ui;
}

void myForm::on_pushButton_clicked()
{
    emit sendData(ui->lineEdit->text()); //获取lineEdit的输入并且传递出去
    this->close();  // 传输完毕之后关闭子窗口
}

(3)主窗口的实现
视图的实现增加一个显示的textEdit

Qt5--多窗口编程实例

主窗口文件mainwindow.h—-增加了接收数据的槽

Qt5--多窗口编程实例

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "logindlg.h"
#include <QDialog>
#include <QMessageBox>
#include <QDebug>
#include "myform.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

    void receiveData(QString data);  //接收传递过来的数据的槽

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

mainwindow.cpp—–增加了信号与槽(数据传输的)实现函数,以及接收数据槽函数的实现

Qt5--多窗口编程实例

#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()
{
    QMessageBox msgBox;
    msgBox.setText(tr("The document has been modified."));
    msgBox.setInformativeText(tr("Do you want to save your changes?"));
    msgBox.setDetailedText(tr("Differences here..."));
    msgBox.setStandardButtons(QMessageBox::Save
                              | QMessageBox::Discard
                              | QMessageBox::Cancel);
    msgBox.setDefaultButton(QMessageBox::Save);
    int ret = msgBox.exec();
    switch (ret) {
    case QMessageBox::Save:
        qDebug() << "Save document!";
        break;
    case QMessageBox::Discard:
        qDebug() << "Discard changes!";
        break;
    case QMessageBox::Cancel:
        qDebug() << "Close document!";
        break;
    }
}

void MainWindow::on_pushButton_2_clicked()
{
    myForm *form = new myForm(this);
    // 连接信号与槽
    connect(form, SIGNAL(sendData(QString)), this, SLOT(receiveData(QString)));
    form->show();
}

void MainWindow::receiveData(QString data)
{
    ui->textEdit->setText(data);
}

效果图

Qt5--多窗口编程实例

下载链接

相关标签: Qt5

上一篇: 3

下一篇: javaGUI基础(一)