QT编程-----------------窗口部件的使用(QWidget和QDialog)

窗口部件
QT提供的默认基类只有QMainWindow、QWidget、和QDialog这三种,这三种窗体也是用的最多的,QMainWindow是带有菜单栏和工具栏的主窗口类,QDialog是各种对话框的基类,而他们全部继承自QWidget。不仅如此,所以的窗口部件都继承自QWidget,继承关系如图所示。
 

QT编程-----------------窗口部件的使用(QWidget和QDialog)

2.多窗口切换

Qt使用信号与槽机制来完成对象之间的协同操作,简单来说,信号与槽都是函数,比如单击窗口上一个按钮弹出一个对话框,那么可以将这个按钮的单击信号和自定义的槽函数关联起来,在这个槽中创建一个对话框来显示他。

void Widget::on_pushButton_clicked()

{

    QDialog *dialog =new QDialog();

    dialog->exec();

}

 

3.自定义对话框

这里可以自定义一个对话框,来实现与主界面的切换,比如先弹出来登录界面,之后点击按钮来实现切换到主界面。

第一步,添加登录框,首先添加QT设计师界面类,界面模版和类名选好后,加入控件,如图 

QT编程-----------------窗口部件的使用(QWidget和QDialog)

第二步,设计信号与槽,在退出程序的按钮上实现信号与槽,如图:

QT编程-----------------窗口部件的使用(QWidget和QDialog)

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是符合要求的,就会消失登陆界面转到显示主界面正常执行。

QT编程-----------------窗口部件的使用(QWidget和QDialog)

在主界面.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();
}
!