5、Qt5基础 多窗口程序

环境:Windows10+Qt5

1、创建项目


2、完成项目创建后,双击mainwindow.ui文件进入设计模式,从左侧部件列表中向界面上拖入一个Push Button,然后双击并修改显示文本为“按钮”,如下图所示。


编辑mainwindow.cpp文件,添加更改按钮文本的代码:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->pushButton->setText("新窗口");//更改按钮的显示文本
}

MainWindow::~MainWindow()
{
    delete ui;
}
 这里的ui对象就是界面文件对应的类的实例,在mainwindow.h文件中对其进行了定义,我们可以通过它来访问设计模式添加到界面上的部件。前面添加的按钮部件Push Button,在其属性面板上可以看到它的objectName属性的默认值为pushButton,这里就是通过这个属性来获取部件对象的。

 这里使用了QPushButton类的setText()函数来设置按钮的显示文本,现在按下Ctrl+R快捷键运行程序,效果如下图所示。



*一般使用tr()函数来处理汉字

更改源代码为:

ui->pushButton->setText(tr("新窗口"));//更改按钮的显示文本

3、添加跳转框




向界面添加一个button来实现跳转


设置信号和槽的关联


选择pushButton的clicked()信号和LoginDlg的accept()槽并按下确定按钮


大家可以把它们都看做是函数,比如这里,当单击了按钮以后就会发射单击信号,即clicked();然后对话框接收到信号就会执行相应的操作,即执行accept()槽。一般情况下,我们只需要修改槽函数即可,不过,这里的accept()已经实现了默认的功能,它会将对话框关闭并返回QDialog::Accepted标识,所以无需再做更改。下面我们要使用返回的QDialog::Accepted标识来判断是否按下了登录按钮。

 完成后,可以按下F3键来返回控件编辑模式。



4、使用自定义对话框类

1.按下Ctrl+2返回代码编辑模式,在这里打开main.cpp文件,添加代码:

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

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    loginDLg dlg;                        // 建立自己新建的LoginDlg类的实例dlg
     if(dlg.exec() == QDialog::Accepted) // 利用Accepted返回值判断按钮是否被按下
     {
         w.show();                      // 如果被按下,显示主窗口
         return a.exec();              // 程序一直执行,直到主窗口关闭
     }
     else return 0;          //如果没有被按下,则不会进入主窗口,整个程序结束运行
    return a.exec();
}

在这里,我们先创建了LoginDlg类的对象dlg,然后让dlg运行,即执行exec()函数,这样会显示对话框窗口,然后判断exec()的返回值,如果用户按下了登录按钮,那么返回值应该是Accepted,这时就显示主窗口,并正常执行程序;如果没有按下登录按钮,那么就结束程序。

现在大家可以运行程序,测试一下效果。


点击后



5、面讲述了一种显示对话框的情况,下面再来讲述一种情况。我们打开mainwindow.ui文件进入设计模式,然后在“按钮”部件上右击并选择转到槽菜单,如下图所示。



 在弹出的转到槽对话框中选择第一个clicked()信号并按下确定按钮。这时会跳转到编辑模式mainwindow.cpp文件的on_pushButton_clicked()函数处,这个就是自动生成的槽,已经自动在mainwindow.h文件中进行了声明。我们只需要更改函数体即可。这里更改为:

void loginDLg::on_pushButton_clicked()
{
    QDialog *dlg = new QDialog(this);
    dlg->show();  
}

我们创建了一个对话框对象,然后让其显示,创建时指定的this参数表明这个对话框的父窗口是MainWindow。注意还需要在mainwindow.cpp文件的开头添加#include 头文件包含。有的童鞋可能会问,如果多次按下按钮,那么每次都会生成一个对话框,是否会造成内存泄露或者内存耗尽?这里简单说明一下,Qt的对象树机制保证了不会造成内存泄露,而且不用写delete语句,因为指明了对话框的父部件,所以当主窗口MainWindow销毁时会自动销毁创建的对话框。当然,严谨的童鞋也可以在mainwindow.h文件中先定义一个对话框对象,并在构造函数中进行创建,然后再到这里使用。最后大家可以运行一下程序,查看效果。



这个程序里我们使用了两类窗口打开的方式,一个是自身消失而后打开另一个窗口一个是打开另一个窗口而自身不消失。可以看到他们实现的方法是不同的。而且我们还使用了两种方式来使用信号和槽,一种是直接在设计模式编辑信号和槽,另一种是在设计模式通过部件的“转到槽”菜单来自定义槽函数。信号和槽是Qt非常核心的内容,可以说如果不会灵活使用信号和槽,那么使用Qt也就失去了意义,但是大家也不用急于掌握它,后面我们会循序渐进地学习。

猜你喜欢

转载自blog.csdn.net/qq_36109528/article/details/80254865
今日推荐