窗口部件
QT提供的默认基类只有QMainWindow、QWidget、和QDialog这三种,这三种窗体也是用的最多的,QMainWindow是带有菜单栏和工具栏的主窗口类,QDialog是各种对话框的基类,而他们全部继承自QWidget。不仅如此,所以的窗口部件都继承自QWidget,继承关系如图所示。
1.基础窗口部件QWidget
QWidget类是所有用户界面对象的基类,被称为基础窗口部件。像主窗口、对话框、标签、还有按钮、文本输入框等都是窗口部件。这些部件可以接受用户输入,显示数据和状态信息,并且在屏幕上绘制自己。QT把没有嵌入到其它部件的部件称为窗口,一般窗口都有边框和标题栏,就像程序中的widget和label一样,QMainWindow和大量的QDialog子类是最一般的窗口类型,窗口就是没有父部件的部件,所以又称为顶级部件,
2.对话框QDialog
1.模态对话框和非模态对话框
QDialog类是所有对话框窗口类的基类,对话框窗口是一个经常用来完成短小任务或者和用户进行简单交互的顶层窗口。按照运行对话框是否可以和该程序其它窗口交互,对话框被称为:模态和非模态的。
模态对话框 即在没有关闭之前,不能再与同一个应用程序的其它窗口进行交互,比如新建项目时弹出的对话框。要使一个对话框称为模态的,则只需要调用它的exec()函数。
非模态对话框 即可以在同一程序中与他交互,如查找替换对话框。要使之称为非模态,可以先使用new 操作来创建QDialog,然后再使用->show()函数显示。
2.多窗口切换
Qt使用信号与槽机制来完成对象之间的协同操作,简单来说,信号与槽都是函数,比如单击窗口上一个按钮弹出一个对话框,那么可以将这个按钮的单击信号和自定义的槽函数关联起来,在这个槽中创建一个对话框来显示他。
void Widget::on_pushButton_clicked()
{
QDialog *dialog =new QDialog();
dialog->exec();
}
3.自定义对话框
这里可以自定义一个对话框,来实现与主界面的切换,比如先弹出来登录界面,之后点击按钮来实现切换到主界面。
第一步,添加登录框,首先添加QT设计师界面类,界面模版和类名选好后,加入控件,如图
第二步,设计信号与槽,在退出程序的按钮上实现信号与槽,如图:
F4进入信号与槽编辑模式,然后左键拖动到要关联的控件,之后在弹出的对话框中选择信号与槽,之后可以按F3退出。之后是进入主界面按钮的信号与槽,右键转到槽,在里面写上accept(),这个accept()函数就是QDialog类的一个槽,对于一个使用exec函数实现的模态对话框,执行这个槽就会隐藏这个模态对话框,并返回QDialog::Accepted值,这里就是要使用这个值来判断是哪个按钮被按下了,与其对应的还有一个reject()槽,它可以返回一个QDialog::Rejected值,前面的“退出程序”按钮也可以关联这个槽。
第三步,设置主界面 main.cpp函数如下:
#include "widget.h"
#include <QApplication>
#include "mydialog.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
MyDialog dialog; //新建自定义MyDialog对象
if(dialog.exec() == QDialog::Accepted) //判断dialog执行结果
{
w.show(); //如果按下了“进入主界面”按钮,则进入主界面
return a.exec();
}
else return 0; //否则退出程序
}
dialog.exec()先显示模态对话框,如果点击了按钮,由于设置了进入主界面的槽是acccept(),所以返回值= QDialog::Accepted是符合要求的,就会消失登陆界面转到显示主界面正常执行。
4.主界面返回登录框
在主界面.ui文件里加上重新登录按钮和退出。退出的信号与槽和前面的退出一样,F4关联close()即可;重新登录的按钮先创建clicked()的槽,并改成如下:
#include "widget.h"
#include "ui_widget.h"
#include <QDialog>
#include "mydialog.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{ //按下重新登录先隐藏当前界面
close();
MyDialog dlg;
//显示登陆界面,如果返回值等于这个,也就是点击了登录,那么程序显示主界面,如果不是,由于此时没有可以显示的界面就会完全退出程序
if(dlg.exec() ==QDialog::Accepted)show();
}