05 Qt布局 对话框

目录

01 QLayout&QStackedWidget类

001 QLayout(基本布局)

002 QStackedWidget Class(堆栈窗体)

 02 QSplitter类与QDockWidget类

001 QSplitter类(窗口分割)

002 QDockWidget类(停靠窗口)

  03 Qt文件对话框实战

001 QFileDialog(文件对话框)

 04 QColorDialog颜色对话框实战

001 QColorDialog类(颜色对话框)

 05 QFontDialog字体对话框实战

001 QFontDialog类(字体对话框类)

  06 QInputDialog类输入对话框实战

001 QInputDialog类(输入对话框)

  07 QMessageBox类消息框实战

001 QMessageBox类(消息框)

  08 Qt自定义消息框实战


01 QLayout&QStackedWidget类

001 QLayout(基本布局)

Qt提供QHBoxLayout类、QVBoxLayout类、QGridLayout类等基本布局管理。

父类子类
QLayout ClassQObject and QLayoutItemQBoxLayout,QFormLayout,QGridLayout,QStackedLayout
QBoxLayout ClassQLayout QBoxLayout,QVBoxLayout
QGridLayout ClassQLayout ————
QLayout ClassQLayout ————

 各类之间继承关系:

案例:

(1)创建dialog项目。

(2)修改"dialog.h"文件。

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QLabel>
#include <QLineEdit>
#include <QComboBox>
#include <QTextEdit>
#include <QGridLayout>
#include <QPushButton>
#include <QHBoxLayout>

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = nullptr);
    ~Dialog();

private:
    //左侧:网格布局
    QGridLayout *lLayout;
    QLabel *UserNumber;
    QLineEdit *UserNumberEdit;
    QLabel *UserName;
    QLineEdit *UserNameEdit;
    QLabel *UserSex;
    QComboBox *UserSexComboEdit;
    QLabel *UserDepart;
    QTextEdit *UserDepartTextEdit;
    QLabel *UserAge;
    QLineEdit *UserAgeLineEdit;
    //右侧:竖直布局
    QVBoxLayout *RightLayout;
    QLabel *MyselfInfo;
    QTextEdit *MyselfInfoTextEdit;

    //右侧下部分
    QPushButton *okbutton;
    QPushButton *cancelbutton;
    QHBoxLayout *buttonLayout;

};
#endif // DIALOG_H

(3)修改"dialog.cpp"文件。 

#include "dialog.h"
Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{
    //左侧控件
    setWindowTitle("员工信息");
    UserNumber = new QLabel("员工工号:");
    UserNumberEdit = new QLineEdit;
    UserName = new QLabel("员工姓名:");
    UserNameEdit = new QLineEdit;
    UserSex = new QLabel("员工性别:");
    UserSexComboEdit = new QComboBox;
    UserSexComboEdit ->addItem("男");
    UserSexComboEdit ->addItem("女");
    UserDepart = new QLabel("所在部门:");
    UserDepartTextEdit = new QTextEdit;
    UserAge = new QLabel("员工年龄");
    UserAgeLineEdit = new QLineEdit;

    //右侧控件
    RightLayout = new QVBoxLayout();
    MyselfInfo = new QLabel("个人简历:");
    MyselfInfoTextEdit = new QTextEdit;
    RightLayout ->addWidget(MyselfInfo);
    RightLayout ->addWidget(MyselfInfoTextEdit);

    //右侧下部分
    okbutton = new QPushButton("确认");
    cancelbutton = new QPushButton("退出");
    buttonLayout = new QHBoxLayout();
    buttonLayout->addStretch();
    buttonLayout->addWidget(okbutton);
    buttonLayout->addWidget(cancelbutton);



    //网格布局,将控件添加到布局中
    lLayout = new QGridLayout();
    lLayout->addWidget(UserNumber,0,0);
    lLayout->addWidget(UserNumberEdit,0,1);
    lLayout->addWidget(UserName,1,0);
    lLayout->addWidget(UserNameEdit,1,1);
    lLayout->addWidget(UserSex,2,0);
    lLayout->addWidget(UserSexComboEdit,2,1);
    lLayout->addWidget(UserDepart,3,0);
    lLayout->addWidget(UserDepartTextEdit,3,1);
    lLayout->addWidget(UserAge,4,0);
    lLayout->addWidget(UserAgeLineEdit,4,1);

    QGridLayout *mlayout = new QGridLayout(this);
    mlayout->addLayout(lLayout,0,0);
    mlayout->addLayout(RightLayout,0,1);
    mlayout->addLayout(buttonLayout,1,1);
}

Dialog::~Dialog()
{
}

(4)结果演示。

002 QStackedWidget Class(堆栈窗体)

父类子类
QStackedWidget ClassQFrame————
QFrame ClassQWidgetQAbstractScrollArea、QLabel、QLCDNumber、QSplitter、QStackedWidget、QToolBox

QStackedWidget控件相当于一个窗口一样,提供一个空间专门存放一些控件(并且每次只能有一个控件可见,被设置为当前的控件)。

案例:

(1)创建dialog项目。

(2)修改"dialog.h"文件。

#ifndef STACKEDDLG_H
#define STACKEDDLG_H

#include <QMainWindow>
#include <QListWidget>
#include <QStackedWidget>
#include <QLabel>

class stackeddlg : public QMainWindow
{
    Q_OBJECT

public:
    stackeddlg(QWidget *parent = nullptr);
    ~stackeddlg();

public:
    QStackedWidget *stacks;
    QListWidget *qlist;             //列表框控件选择
    QLabel *lab1,*lab2,*lab3,*lab4,*lab5;
};
#endif // STACKEDDLG_H

(3)修改"dialog.cpp"文件。 

#include "stackeddlg.h"
#include <QHBoxLayout>

stackeddlg::stackeddlg(QWidget *parent)
    : QMainWindow(parent)
{
    setWindowTitle("堆栈窗体测试");
    this ->setGeometry(200,200,600,400);
    qlist =new QListWidget(this);
    qlist ->setGeometry(0,0,100,120);
    qlist ->insertItem(0,"Linux1");
    qlist ->insertItem(1,"Linux2");
    qlist ->insertItem(2,"Linux3");
    qlist ->insertItem(3,"Linux4");
    qlist ->insertItem(4,"Linux5");

    lab1 = new QLabel("Linux1 Qt");
    lab2 = new QLabel("Linux2 Qt");
    lab3 = new QLabel("Linux3 Qt");
    lab4 = new QLabel("Linux4 Qt");
    lab5 = new QLabel("Linux5 Qt");

    QStackedWidget *statcks = new QStackedWidget(this);
    statcks -> setGeometry(200,20,100,200);     //该控件一次只能显示一个。
    statcks -> addWidget(lab1);
    statcks -> addWidget(lab2);
    statcks -> addWidget(lab3);
    statcks -> addWidget(lab4);
    statcks -> addWidget(lab5);

    QHBoxLayout *mlayout =new QHBoxLayout(this);
    mlayout -> setSpacing(10);
    mlayout -> addWidget(qlist);
    mlayout -> addWidget(stacks,0,Qt::AlignCenter);
    mlayout -> setStretchFactor(qlist,1);
    mlayout -> setStretchFactor(stacks,1);
}

stackeddlg::~stackeddlg()
{
}

(4)结果演示。

 02 QSplitter类与QDockWidget类

001 QSplitter类(窗口分割)

Qt提供QSplitter类来进行分裂布局,QSplitter派生于QFrame。

案例:

(1)创建mainwindow项目。

(2)修改"main.cpp"文件。

#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
//    w.show();
    return a.exec();
}

(3)修改"mainwindow.cpp"文件。

#include "mainwindow.h"
#include <QSplitter>
#include <QTextEdit>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    setWindowTitle("Splitter类拆分窗口测试");
    //1:拆分窗口(分割窗口、分裂窗口布局)
    QSplitter *spMainWindow = new QSplitter(Qt::Horizontal,0);
    QTextEdit *textedit = new QTextEdit("左边主窗口",spMainWindow);

    //2:拆分右边部分窗口
    QSplitter *spRight = new QSplitter(Qt::Vertical,spMainWindow);
    QTextEdit *teteditup = new QTextEdit("右边上部分窗口",spRight);
    QTextEdit *teteditdown = new QTextEdit("右边下部分窗口",spRight);

    //3:
    QSplitter *sptest = new QSplitter(Qt::Vertical,spRight);
    QTextEdit *txtedittest = new QTextEdit("Qt开发工程师课程",sptest);

    //4:
    QSplitter *sptested = new QSplitter(Qt::Horizontal,spMainWindow);
    QTextEdit *txtedittestend = new QTextEdit("Qt开发学习",spMainWindow);

    spMainWindow ->setWindowTitle("Splitter类拆分窗口测试");
    spMainWindow ->show();
}

MainWindow::~MainWindow()
{
}

(4)结果演示。

002 QDockWidget类(停靠窗口)

 QDockWidget类提供一个窗体部件,其可以停靠在QMainWindow,本身作为一个在桌面上的顶级窗口(也就是父窗体)。

Dock Windows它可以在几个区域中移动、悬浮和关闭等。通过API让程序员限制dockwidget操作。

案例:

(1)创建mainwindow项目。

(2)修改"mainwindow.h"文件。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
public:
    void DockWidgetFunc();

};
#endif // MAINWINDOW_H

(3)修改"mainwindow.cpp"文件。

#include "mainwindow.h"
#include <QTextEdit>
#include <QDockWidget>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    DockWidgetFunc();
}

MainWindow::~MainWindow()
{

}

void MainWindow::DockWidgetFunc()
{
    setWindowTitle("QDockWidget类停靠窗口测试:");
    QTextEdit *tedit = new QTextEdit(this);               //定义QTextEdit对象作为主窗口
    tedit->setText("李白");
    tedit -> setAlignment(Qt::AlignCenter);
    setCentralWidget(tedit);                              //将编辑框控件设置为主窗口的中央窗体
    //创建停靠窗口1
    QDockWidget *dw1 = new QDockWidget("停靠窗口(一)",this);
    dw1 -> setFeatures(QDockWidget::DockWidgetMovable);   //可移动特性
    dw1 -> setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea);

    QTextEdit *qtedit1 = new QTextEdit();
    qtedit1 ->setText(
                    "将进酒·君不见\n"
                    "君不见,黄河之水天上来,奔流到海不复回。\n"
                    "君不见,高堂明镜悲白发,朝如青丝暮成雪。\n"
                    "人生得意须尽欢,莫使金樽空对月。\n"
                    "天生我材必有用,千金散尽还复来。\n"
                    "烹羊宰牛且为乐,会须一饮三百杯。\n"
                    "岑夫子,丹丘生,将进酒,杯莫停。\n"
                    "与君歌一曲,请君为我倾耳听。\n"
                    " 钟鼓馔玉不足贵,但愿长醉不愿醒。\n"
                    "古来圣贤皆寂寞,惟有饮者留其名。\n"
                    "陈王昔时宴平乐,斗酒十千恣欢谑。\n"
                    "主人何为言少钱,径须沽取对君酌。\n"
                    "五花马,千金裘,呼儿将出换美酒,与尔同销万古愁。");
    dw1 -> setWidget(qtedit1);
    addDockWidget(Qt::RightDockWidgetArea,dw1);


    //创建停靠窗口2
    QDockWidget *dw2 = new QDockWidget("停靠窗口(二)",this);
    dw2->setFeatures(QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetFloatable);    //设置窗口关闭  浮动按钮
    QTextEdit *qtedit2 = new QTextEdit();
    qtedit2 -> setText("蜀道难:\n噫吁嚱,危乎高哉!蜀道之难,难于上青天!蚕丛及鱼凫,开国何茫然!尔来四万八千岁,不与秦塞通人烟。西当太白有鸟道,可以横绝峨眉巅。地崩山摧壮士死,然后天梯石栈相钩连。上有六龙回日之高标,下有冲波逆折之回川。黄鹤之飞尚不得过,猿猱欲度愁攀援。青泥何盘盘,百步九折萦岩峦。扪参历井仰胁息,以手抚膺坐长叹。 问君西游何时还?畏途巉岩不可攀。但见悲鸟号古木,雄飞雌从绕林间。又闻子规啼夜月,愁空山。蜀道之难,难于上青天,使人听此凋朱颜!连峰去天不盈尺,枯松倒挂倚绝壁。飞湍瀑流争喧豗,砯崖转石万壑雷。其险也如此,嗟尔远道之人胡为乎来哉!剑阁峥嵘而崔嵬,一夫当关,万夫莫开。所守或匪亲,化为狼与豺。朝避猛虎,夕避长蛇;磨牙吮血,杀人如麻。锦城虽云乐,不如早还家。蜀道之难,难于上青天,侧身西望长咨嗟!");
    dw2 -> setWidget(qtedit2);
    addDockWidget(Qt::RightDockWidgetArea,dw2);
}

(4)结果演示。

  03 Qt文件对话框实战

001 QFileDialog(文件对话框)

通过QFileDialog类允许用户遍历系统文件,选择一个或多个文件或目录。

案例:

(1)创建Dialog项目。

(2)修改"dialog.h"文件。

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QLabel>
#include <QLineEdit>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QFileDialog>
#include <QPushButton>

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = nullptr);
    ~Dialog();
private:
    QLabel *FileNameLabel;
    QLineEdit *FileNameLineEdit;

    QPushButton *FileButton;

    QLabel *FileSizeLabel;
    QLineEdit *FileSizeLabelLineEdit;

    QPushButton *GetFileInfoButton;
private slots:
    void GetFileInfo();                   //打开文件函数
    void GetFileSizeFunc();               //获取文件大小函数
};
#endif // DIALOG_H

(3)修改"dialog.cpp"文件。

#include "dialog.h"

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{
    setWindowTitle("FileDialog文件对话框测试");

    //创建控件
    FileNameLabel = new QLabel("文件名称:");
    FileNameLineEdit = new QLineEdit;
    FileButton = new QPushButton("选择...");
    FileSizeLabel = new QLabel("文件大小:");
    FileSizeLabelLineEdit = new QLineEdit;
    GetFileInfoButton = new QPushButton("获取文件大小");

    //排列布局
    QGridLayout *glayout = new QGridLayout;
    glayout->addWidget(FileNameLabel,0,0);
    glayout->addWidget(FileNameLineEdit,0,1);
    glayout->addWidget(FileButton,0,2);
    glayout->addWidget(FileSizeLabel,1,0);
    glayout->addWidget(FileSizeLabelLineEdit,1,1,1,2);
    glayout->addWidget(GetFileInfoButton,2,0,1,3);

    QVBoxLayout *vlayout = new QVBoxLayout(this);
    vlayout->addLayout(glayout);

    connect(FileButton,SIGNAL(clicked(bool)),this,SLOT(GetFileInfo()));
    connect(GetFileInfoButton,SIGNAL(clicked()),this,SLOT(GetFileSizeFunc()));

}

Dialog::~Dialog()
{
}

void Dialog::GetFileInfo()                   //打开文件函数
{
    QString strFileName = QFileDialog::getOpenFileName(this,"打开","/","Files(*)");       //读取文件路径
    FileNameLineEdit ->setText(strFileName);               //将文件路径写入控件中
}

void Dialog::GetFileSizeFunc()               //获取文件大小函数
{
    //获取单行编辑框控件里面文件路径等
   QString strFileNames = FileNameLineEdit->text();          //获取文件路径
   QFileInfo fileinfo(strFileNames);                         //获取文件信息
   qint64 FileSize=fileinfo.size();                          //获取文件大小
   FileSizeLabelLineEdit->setText(QString::number(FileSize));       //将文件大小显示到控件
}

 (4)结果演示。

 04 QColorDialog颜色对话框实战

001 QColorDialog类(颜色对话框)

Qt中提供标准对话框,其中QColorDialog类(颜色对话框)。备注:不同系统平台显示结果有所不同(原因系统主题风格不一致,但功能相同)。

案例:

(1)创建Dialog项目。

(2)修改"dialog.h"文件。

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QPushButton>
#include <QFrame>
#include <QColorDialog>
#include <QGridLayout>

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = nullptr);
    ~Dialog();

private:
    QGridLayout *glayout;
    QPushButton *colorbutton;

    // QFrame类是基本控件的基类,QWidget是QFrame类型
    QFrame *colorFrame;

private slots:
    void dispcolorFunc();

};
#endif // DIALOG_H

(3)修改"dialog.cpp"文件。

#include "dialog.h"
#include <QPushButton>
#include <QDebug>

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{
    setWindowTitle("颜色对话框");

    glayout = new QGridLayout(this);        //新建一个布局对象

    colorbutton = new QPushButton("调用颜色对话框");
    colorFrame = new QFrame;
    colorFrame->setFrameShape(QFrame::Box); //设置形状
    colorFrame->setAutoFillBackground(true);    //填充背景处理
    glayout ->addWidget(colorbutton,0,0);
    glayout ->addWidget(colorFrame,1,0);

    connect(colorbutton,SIGNAL(clicked()),this,SLOT(dispcolorFunc()));
}

Dialog::~Dialog()
{
}

void Dialog::dispcolorFunc()
{
    QColor colorvalues = QColorDialog::getColor(Qt::red);     //获取颜色值,默认选择红色
    if(colorvalues.isValid())
    {
        colorFrame->setPalette(QPalette(colorvalues));
    }
}

 (4)结果演示。 

 05 QFontDialog字体对话框实战

001 QFontDialog类(字体对话框类)

Qt提供字体对话框选择(字体、字号、样式等)。

案例:

(1)创建Dialog项目。

(2)修改"dialog.h"文件。

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QLineEdit>
#include <QFontDialog>
#include <QGridLayout>
#include <QPushButton>

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = nullptr);
    ~Dialog();
private:
    QGridLayout *glayout;
    QPushButton *fontButton;
    QLineEdit *fontlineedit;

private slots:
    void dispFontFunc();
};
#endif // DIALOG_H

 (3)修改"dialog.cpp"文件。

#include "dialog.h"

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{
    setWindowTitle("字体对话框设置");
    glayout = new QGridLayout(this);
    fontButton = new QPushButton("调用字体对话框");
    fontlineedit = new QLineEdit;
    fontlineedit->setText("Qt开发工程师");
    glayout ->addWidget(fontButton,0,0);
    glayout ->addWidget(fontlineedit,0,1);

    connect(fontButton,SIGNAL(clicked(bool)),this,SLOT(dispFontFunc()));

}

Dialog::~Dialog()
{
}

void Dialog::dispFontFunc()
{
    bool isbool;
    QFont font = QFontDialog::getFont(&isbool);             //获取字体形式
    if(isbool)                      //判断字体形式是否被修改
    {
        fontlineedit->setFont(font);
    }

}

 (4)结果演示。 

  06 QInputDialog类输入对话框实战

001 QInputDialog类(输入对话框)

Qt提供标准输入对话框(QInputDialog类),里面各个控件由工程师自己决定,方便定制开发使用。

案例:

(1)创建Dialog项目。

(2)修改"dialog.h"文件。

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QGridLayout>
#include <QLineEdit>
#include <QPushButton>
#include <QInputDialog>

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = nullptr);
    ~Dialog();
private:
    QGridLayout *glayout;

    QPushButton *inputstudentnobutton;
    QLineEdit *inputsstudentlineedit;

    QPushButton *inputstudentnamebutton;
    QLineEdit *inputsstudentnamelineedit;

    QPushButton *inputstudentsexbutton;
    QLineEdit *inputsstudentsexlineedit;

    QPushButton *inputstudentscorebutton;
    QLineEdit *inputsstudentscorelineedit;
private slots:
    void modifystudentno();
    void modifystudentsex();
};
#endif // DIALOG_H

 (3)修改"dialog.cpp"文件。

#include "dialog.h"

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{
    setWindowTitle("标准对话框窗体测试");
    resize(260,110);

    //布局
    glayout = new QGridLayout(this);

    inputstudentnobutton = new QPushButton;
    inputstudentnobutton->setText("学生学号:");
    inputsstudentlineedit = new QLineEdit("20170716");

    inputstudentnamebutton = new QPushButton;
    inputstudentnamebutton->setText("学生姓名:");
    inputsstudentnamelineedit = new QLineEdit("张三");

    inputstudentsexbutton = new QPushButton;
    inputstudentsexbutton->setText("学生性别:");
    inputsstudentsexlineedit = new QLineEdit("男");

    inputstudentscorebutton = new QPushButton;
    inputstudentscorebutton->setText("学生分数:");
    inputsstudentscorelineedit = new QLineEdit("100");

    glayout->addWidget(inputstudentnobutton,0,0);
    glayout->addWidget(inputsstudentlineedit,0,1);
    glayout->addWidget(inputstudentnamebutton,1,0);
    glayout->addWidget(inputsstudentnamelineedit,1,1);
    glayout->addWidget(inputstudentsexbutton,2,0);
    glayout->addWidget(inputsstudentsexlineedit,2,1);
    glayout->addWidget(inputstudentscorebutton,3,0);
    glayout->addWidget(inputsstudentscorelineedit,3,1);

    connect(inputstudentnobutton,SIGNAL(clicked(bool)),this,SLOT(modifystudentno()));
    connect(inputstudentsexbutton,SIGNAL(clicked(bool)),this,SLOT(modifystudentsex()));
}

Dialog::~Dialog()
{

}


void Dialog::modifystudentno()
{
    bool isbool;
    QString strText=QInputDialog::getText(this,"标准对话框","请输入学号:",
                    QLineEdit::Normal,inputsstudentlineedit->text(),&isbool);
    if(isbool && !strText.isEmpty())
    {
        inputsstudentlineedit->setText(strText);
    }
}
void Dialog::modifystudentsex()
{
    QStringList strSexItems;
    strSexItems<<"男"<<"女";
    bool isbool;
    QString strsexItem= QInputDialog::getItem(this,"标准输入对话框","请选择性别:",strSexItems,0,false,&isbool);
    if(isbool&&!strsexItem.isEmpty())
    {
        inputsstudentsexlineedit->setText(strsexItem);
    }
}

 (4)结果演示。 

  07 QMessageBox类消息框实战

001 QMessageBox类(消息框)

Qt提供QMessageBox类消息框应用,它是一个常用的模式对话框,专门用于显示和提示性消息,用户可通过淡季标准按钮来响应用户的需求。

案例:

(1)创建Dialog项目。

(2)修改"dialog.h"文件。

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QLabel>
#include <QPushButton>
#include <QGridLayout>
#include <QMessageBox>

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = nullptr);
    ~Dialog();

private:
    QGridLayout *glayout;
    QLabel *displabel;
    QPushButton *questionbutton;            //问题消息框命令按钮
    QPushButton *informationbutton;         //信息消息框命令按钮
    QPushButton *warningbutton;             //警告消息框命令按钮
    QPushButton *criticalbutton;            //错误消息框命令按钮
    QPushButton *aboutbutton;               //关于消息框命令按钮
    QPushButton *aboutqbuttonn;             //
private slots:
    void displayquestionMsg();
    void displayinformationMsg();
    void displaywarningMsg();
    void displaycriticalMsg();
    void displayaboutMsg();
    void displayaboutqMsg();

};
#endif // DIALOG_H

 (3)修改"dialog.cpp"文件。

#include "dialog.h"

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{
    resize(320,150);
    glayout = new QGridLayout(this);
    displabel = new QLabel("请你选择一个消息框");
    questionbutton = new QPushButton("QuestionMsg");              //问题消息框命令按钮
    informationbutton= new QPushButton("informationMsg");         //信息消息框命令按钮
    warningbutton= new QPushButton("warningMsg");                 //警告消息框命令按钮
    criticalbutton= new QPushButton("criticalMsg");               //错误消息框命令按钮
    aboutbutton= new QPushButton("aboutMsg");                     //关于消息框命令按钮
    aboutqbuttonn= new QPushButton("aboutqMsg");                  //

    glayout ->addWidget(displabel,0,0,1,2);
    glayout ->addWidget(questionbutton,1,0);
    glayout ->addWidget(informationbutton,1,1);
    glayout ->addWidget(warningbutton,2,0);
    glayout ->addWidget(criticalbutton,2,1);
    glayout ->addWidget(aboutbutton,3,0);
    glayout ->addWidget(aboutqbuttonn,3,1);
    connect(questionbutton,SIGNAL(clicked(bool)),this,SLOT(displayquestionMsg()));
    connect(informationbutton,SIGNAL(clicked(bool)),this,SLOT(displayinformationMsg()));
    connect(warningbutton,SIGNAL(clicked(bool)),this,SLOT(displaywarningMsg()));
    connect(criticalbutton,SIGNAL(clicked(bool)),this,SLOT(displaycriticalMsg()));
    connect(aboutbutton,SIGNAL(clicked(bool)),this,SLOT(displayaboutMsg()));
    connect(aboutqbuttonn,SIGNAL(clicked(bool)),this,SLOT(displayaboutqMsg()));

}

Dialog::~Dialog()
{
}


void Dialog::displayquestionMsg()
{
    displabel->setText("Question Message Box");
    switch(QMessageBox::question(this,"Question消息框","你是否想退出应用程序,请选择?",  //QMessageBox::question中"question"与消息框显示图标有关
           QMessageBox::Ok|QMessageBox::Cancel,QMessageBox::Ok))
    {
        case QMessageBox::Ok:
            displabel->setText("你选择QuestionMsg命令按钮中的button/ok!");
        break;
        case QMessageBox::Cancel:
            displabel->setText("你选择QuestionMsg命令按钮中的button/cancel!");
        break;
    }
    return;
}
void Dialog::displayinformationMsg()
{
    displabel->setText("Information Message Box");
    QMessageBox::information(this,"Information消息框","Information消息框测试成功");
}
void Dialog::displaywarningMsg()
{
    displabel->setText("Warning Message Box");
    switch(QMessageBox::warning(this,"Warning消息框","是否删除数据库student.mdb,请注意数据操作安全?",
           QMessageBox::Save|QMessageBox::Discard|QMessageBox::Cancel,QMessageBox::Save))
    {
        case QMessageBox::Save:
            displabel->setText("你选择WarningMsg命令按钮中的button/Save!");
        break;
        case QMessageBox::Discard:
            displabel->setText("你选择WarningMsg命令按钮中的button/Discard!");
        break;
        case QMessageBox::Cancel:
            displabel->setText("你选择WarningMsg命令按钮中的button/cancel!");
    break;
    }
    return;
}
void Dialog::displaycriticalMsg()
{
    displabel->setText("critical QMessageBox");
    QMessageBox::critical(this,"critical消息框","数据库文件备份错误,请重新检查");
}
void Dialog::displayaboutMsg()
{
    displabel->setText("about QMessageBox");
    QMessageBox::about(this,"about消息框","测试Qt about消息框");
}
void Dialog::displayaboutqMsg()
{
    displabel->setText("about Qt QMessageBox");
    QMessageBox::about(this,"about消息框","测试about Qt消息框");
}

 (4)结果演示。 

  08 Qt自定义消息框实战

Qt提供自定义消息框,让用户根据需求定制QMessageBox消息框。

 案例:

(1)创建Dialog项目。

(2)修改"dialog.h"文件。

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>

#include <QMessageBox>
#include <QLabel>
#include <QGridLayout>
#include <QPushButton>



class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = nullptr);
    ~Dialog();

private:
    QLabel *labelmsg,*labeldispmsg;
    QPushButton *msgbutton;

    QGridLayout *glayout;

private slots:
    void customMsg();
};
#endif // DIALOG_H

 (3)修改"dialog.cpp"文件。

#include "dialog.h"

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{

    resize(260,90);

    glayout=new QGridLayout(this);

    labelmsg=new QLabel("自定义消息框");
    msgbutton=new QPushButton("测试操作");

    labeldispmsg=new QLabel("未测试状态");

    glayout->addWidget(labelmsg,0,0);
    glayout->addWidget(msgbutton,0,1);
    glayout->addWidget(labeldispmsg,1,0,1,1);

    connect(msgbutton,SIGNAL(clicked()),this,SLOT(customMsg()));

}

Dialog::~Dialog()
{
}


void Dialog::customMsg()
{
    QMessageBox cMsgBox;
    cMsgBox.setWindowTitle("零声教育消息框");

    // 添加按钮
    QPushButton *yes=cMsgBox.addButton("YES",QMessageBox::ActionRole);
    QPushButton *no=cMsgBox.addButton("NO",QMessageBox::ActionRole);

    // 添加图标
    cMsgBox.setIconPixmap(QPixmap("E:\\File\\Code_Program\\C_C++\\Qt\\Learn\\LingShengQt\\QCustomeMessageBoxPross\\J20.jpg"));
    cMsgBox.exec();

    // 判断用户点击按钮 yes no
    if(cMsgBox.clickedButton()==yes)
    {
        labeldispmsg->setText("用户点击YES按钮");
    }
    else if(cMsgBox.clickedButton()==no)
    {
        labeldispmsg->setText("用户点击NO按钮");
    }
}

 (4)结果演示。 

推荐课程:

https://xxetb.xetslk.com/s/vgpHh

 

  • 10
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值