【Qt】窗口部件 标准对话框

目录

三 窗口部件

1.QWidget

1.1 窗口与子部件

2.QDialog

2.1 模态和非模态对话框

2.2 初始信号和槽并实现多窗口切换

1) 定义信号和槽

2) 自动定义对话框

3) 标准对话框

a.颜色对话框

b.文件对话框

c.字体对话框

d.输入对话框

e.消息对话框

f.进度对话框

g.错误消息对话框

h.向导对话框

*完整代码


三 窗口部件

1.QWidget

widget:用户界面最基本的组成部分,它接收来自于windows系统的鼠标、键盘以及其他事件,然后将它自己绘制在屏幕上。

  • 分类:

1.顶级widget:没有父类的独立窗口。

2.子widget:作为子部件在父类中显示。

3.复合型Widget:把一个widget作为一个容器来存放一组子widget。

1.1 窗口与子部件

  • main.cpp

    #include <QtWidgets>
    ​
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    ​
        // 新建QWidget类对象,默认parent参数是nullptr,所以它是个窗口
        QWidget *widget = new QWidget();
        // 设置窗口标题
        widget->setWindowTitle(QObject::tr("我是widget"));
    ​
        // 新建QLabel对象,默认parent参数是nullptr,所以它是个窗口
        QLabel *label = new QLabel();
        label->setWindowTitle(QObject::tr("我是label"));
        // 设置要显示的信息
        label->setText(QObject::tr("label:我是个窗口"));
        // 改变部件大小,以便能显示出完整的内容
        label->resize(220, 20);
    ​
        // label2指定了父窗口为widget,所以不是窗口,只是widget窗口的子部件
        QLabel *label2 = new QLabel(widget);
        label2->setText(QObject::tr("label2:我不是独立窗口,只是widget的子部件"));
        label2->resize(250, 20);
        // 在屏幕上显示出来
        label->show();
        widget->show();
    ​
        int ret = a.exec();
        delete label;
        delete widget;
        return ret;
    }
  • .pro

    QT+=widgets
    ​
    SOURCES += \
        main.cpp

2.QDialog

2.1 模态和非模态对话框

  • 模块对话框:

    在其没有被关闭之前,用户不能与同一个应用程序的其他窗口进行交互,直到该对话框关闭。

    • //非模态对话框:
      //对话框弹出来,但mywidget窗口并没有出来
      ​
      #include"ui_widget.h"
      #include<QDialog>
      #include "widget.h"
      ​
      Widget::Widget(QWidget *parent)
          : QWidget(parent)
          , ui(new Ui::Widget)
      {
          ui->setupUi(this);
          //QDialog *dialog=new QDialog(this);
          //dialog->show();
          //或者
          QDialog dialog(this); //定义QDialog对象
          dialog.exec();
      }
      ​
      Widget::~Widget()
      {
          delete ui;
      }
  • 非模块对话框:

    对于非模态对话框,当被打开时,用户既可选择和该对话框进行交互,也可以选择同应用程序的其他窗口交互。

    • //模式对话框
      //对话框与widget一起出来
      #include "widget.h"
      #include<QDialog>
      #include"ui_widget.h"
      ​
      Widget::Widget(QWidget *parent)
          : QWidget(parent)
          , ui(new Ui::Widget)
      {
          ui->setupUi(this);
          QDialog *dialog=new QDialog(this);
          dialog->setModal(true);//表示是模式对话框
          dialog->show();
      }
      ​
      Widget::~Widget()
      {
          delete ui;
      }

2.2 初始信号和槽并实现多窗口切换

1) 定义信号和槽

信号和槽都是函数,用于完成对象间的协同操作。

  • 步骤

    1.在widget.hMyWidget类定义中添加槽的声明。

    public slots: //槽一般用关键词slots修饰
        void showChildDialog();

    2.在widget.cpp中定义槽函数的功能。

    void MyWidget::showChildDialog()
    {
         QDialog *dialog=new QDialog(this);
         dialog->show();
    }

    3.在MyWidget类构造函数中,加入connect()函数将单击信号与槽关联。

    即受到指定信号后执行槽函数。

    MyWidget::MyWidget(QWidget*parent):
    QWidget(parent),
    ui(new Ui::MyWidget)
    {
         ui->setupUi(this);
         connect(ui->showChildButton,&QPushButton::clicked,
                this,&MyWidget::showChildDialog);
    }

2) 自动定义对话框

#include "dialog.h"
#include "./ui_dialog.h"
​
Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::Dialog)
{
    ui->setupUi(this);
}
​
Dialog::~Dialog()
{
    delete ui;
}
​
void Dialog::on_pushButton_clicked()
{
    //accept是QDialog中的一个槽
    //功能:1.执行这个槽后隐藏这个模式对话框;2.返回QDialog::Accepted值
    accept();
}
​
void Dialog::on_pushButton_2_clicked()
{
    //reject与accept对应
    //返回一个QDialog::Rejected值
    reject();
}
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
​
QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACE
​
class Dialog : public QDialog
{
    Q_OBJECT
​
public:
    Dialog(QWidget *parent = nullptr);
    ~Dialog();
​
private slots:
    void on_pushButton_2_clicked();
​
    void on_pushButton_clicked();
​
private:
    Ui::Dialog *ui;
};
​
#endif // DIALOG_H
#include "dialog.h"
#include"QWidget"
#include <QApplication>
​
​
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Dialog dialog; //新建类对象
    if(dialog.exec()==QDialog::Accepted) //判断dialog执行结果
    {
        QWidget w;
        w.show(); //如果按下进入主界面按钮,则进入主界面
        return a.exec(); //程序正常运行
    }
    else
    {
        return 0; //退出程序
    }
}

3) 标准对话框

a.颜色对话框

//颜色对话框
void Widget::on_pushButton_clicked()
{
    QColor color=QColorDialog::getColor(Qt::red,this,tr("颜色对话框"));
    qDebug()<<"color:"<<color;
}

b.文件对话框

//文件对话框
void Widget::on_pushButton_2_clicked()
{
//    //读取单个文件
//    QString filename=QFileDialog::getOpenFileName(this,tr("文件对话框"),
//                                                  "D:\photo",tr("图片文件(*.jpg *.png)"));
//    qDebug()<<"fileName:"<<filename;
    //读取多个文件
    QStringList filenames=QFileDialog::getOpenFileNames(this,tr("多文件对话框"),
                                                      "D:\photo",tr("图片文件(*.jpg *.png)"));
    qDebug()<<"filenames:"<<filenames;
}

c.字体对话框

//字体对话框
void Widget::on_pushButton_3_clicked()
{
    bool ok;//是否按下ok
    QFont font=QFontDialog::getFont(&ok,this);
    //如果按下ok,字体对话框按钮使用新字体
    //如果按下cancel,则输出信息
    if(ok)
    {
        ui->pushButton_3->setFont(font);
    }
    else
    {
        qDebug()<<tr("没有选择字体!");
    }
}

d.输入对话框

//输入对话框
void Widget::on_pushButton_4_clicked()
{
    bool ok;
    //获取字符串
    QString string=QInputDialog::getText(this,tr("输入字符串对话框"),
                                         tr("请输入用户名:"),QLineEdit::Normal,tr("admin"),&ok);
    if(ok)
    {
        qDebug()<<"string:"<<string;
    }
​
    //获取整数
    int value1=QInputDialog::getInt(this,tr("输入整数对话框"),
                                    tr("请输入-1000到1000之间的数值"),100,-1000,1000,10,&ok);
    if(ok)
    {
        qDebug()<<"valuel:"<<value1;
    }
    //获取浮点数
    double value2=QInputDialog::getDouble(this,tr("输入浮点数对话框"),
                                         tr("请输入-1000到1000之间的数值"),0.00,-1000,1000,2,&ok);
    if(ok)
    {
        qDebug()<<"value2:"<<value2;
    }
​
    QStringList items;
    items<<tr("条目1")<<tr("条目2");
    //获取条目
    QString item=QInputDialog::getItem(this,tr("输入条目对话框"),
                                       tr("请选择或输入一个条目"),items,0,true,&ok);
    if(ok)
    {
        qDebug()<<"items:"<<item;
    }
}

e.消息对话框

//消息对话框
void Widget::on_pushButton_5_clicked()
{
    //问题对话框
    int ret1=QMessageBox::question(this,tr("问题对话框"),
                                   tr("你了解Qt吗?"),QMessageBox::Yes,QMessageBox::No);
    if(ret1==QMessageBox::Yes)
    {
        qDebug()<<tr("问题!");
    }
​
    //提示对话框
    int ret2=QMessageBox::information(this,tr("提示对话框"),
                                      tr("这是Qt书籍!"),QMessageBox::Ok);
    if(ret2==QMessageBox::Ok)
    {
        qDebug()<<tr("提示!");
    }
​
    //警告对话框
    int ret3=QMessageBox::warning(this,tr("警告对话框"),
                                  tr("不能提前结束!"),QMessageBox::Abort);
    if(ret3==QMessageBox::Abort)
    {
        qDebug()<<tr("警告!");
    }
​
    //错误对话框
    int ret4=QMessageBox::critical(this,tr("严重错误对话框"),
                                   tr("发现一个严重错误!现在要关闭所有文件!"),QMessageBox::YesAll);
    if(ret4==QMessageBox::YesAll)
    {
        qDebug()<<tr("错误");
    }
​
    //关于对话框
    QMessageBox::about(this,tr("关于对话框"),
                       tr("zyy"));
}

f.进度对话框

//进度对话框
void Widget::on_pushButton_6_clicked()
{
    QProgressDialog dialog(tr("文件复制进度"),tr("取消"),0,50000,this);
    dialog.setWindowTitle(tr("进度对话框"));
    dialog.setWindowModality(Qt::WindowModal);//将对话框设置为模态
    dialog.show();
    //演示复制进度
    for(int i=0;i<999999999;i++)
    {
        dialog.setValue(i);//设置进度条的当前值
        QCoreApplication::processEvents();//避免页面冻结
        if(dialog.wasCanceled())
        {
            break;
        }
        dialog.setValue(999999999);
        qDebug()<<tr("复制结束!");
    }
​
}

g.错误消息对话框

//错误消息对话框
void Widget::on_pushButton_7_clicked()
{
    errordlg->setWindowTitle(tr("错误信息对话框"));
    errordlg->showMessage(tr("这里是出错信息!"));
}

h.向导对话框

//3个向导页面
QWizardPage *Widget::createPage1()
{
    QWizardPage *page=new QWizardPage;
    page->setTitle(tr("介绍"));
    return page;
}
QWizardPage *Widget::createPage2()
{
    QWizardPage *page=new QWizardPage;
    page->setTitle(tr("用户信息选择"));
    return page;
}
QWizardPage *Widget::createPage3()
{
    QWizardPage *page=new QWizardPage;
    page->setTitle(tr("结束"));
    return page;
}
//向导对话框
void Widget::on_pushButton_8_clicked()
{
    QWizard wizard(this);
    wizard.setWindowTitle(tr("向导对话框"));
    wizard.addPage(createPage1());//添加向导页面
    wizard.addPage(createPage2());
    wizard.addPage(createPage3());
    wizard.exec();
}

*完整代码

#include "widget.h"
#include "ui_widget.h"
​
#include "QDebug"
#include "QColorDialog"
#include "QFileDialog"
#include "QFontDialog"
#include "QLineEdit"
#include "QInputDialog"
#include "QMessageBox"
#include "QProgressDialog"
#include "QErrorMessage"
​
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
​
    errordlg=new QErrorMessage(this);
}
​
Widget::~Widget()
{
    delete ui;
}
​
//颜色对话框
void Widget::on_pushButton_clicked()
{
    QColor color=QColorDialog::getColor(Qt::red,this,tr("颜色对话框"));
    qDebug()<<"color:"<<color;
}
​
//文件对话框
void Widget::on_pushButton_2_clicked()
{
//    //读取单个文件
//    QString filename=QFileDialog::getOpenFileName(this,tr("文件对话框"),
//                                                  "D:\photo",tr("图片文件(*.jpg *.png)"));
//    qDebug()<<"fileName:"<<filename;
    //读取多个文件
    QStringList filenames=QFileDialog::getOpenFileNames(this,tr("多文件对话框"),
                                                      "D:\photo",tr("图片文件(*.jpg *.png)"));
    qDebug()<<"filenames:"<<filenames;
}
​
//字体对话框
void Widget::on_pushButton_3_clicked()
{
    bool ok;//是否按下ok
    QFont font=QFontDialog::getFont(&ok,this);
    //如果按下ok,字体对话框按钮使用新字体
    //如果按下cancel,则输出信息
    if(ok)
    {
        ui->pushButton_3->setFont(font);
    }
    else
    {
        qDebug()<<tr("没有选择字体!");
    }
}
​
//输入对话框
void Widget::on_pushButton_4_clicked()
{
    bool ok;
    //获取字符串
    QString string=QInputDialog::getText(this,tr("输入字符串对话框"),
                                         tr("请输入用户名:"),QLineEdit::Normal,tr("admin"),&ok);
    if(ok)
    {
        qDebug()<<"string:"<<string;
    }
​
    //获取整数
    int value1=QInputDialog::getInt(this,tr("输入整数对话框"),
                                    tr("请输入-1000到1000之间的数值"),100,-1000,1000,10,&ok);
    if(ok)
    {
        qDebug()<<"valuel:"<<value1;
    }
    //获取浮点数
    double value2=QInputDialog::getDouble(this,tr("输入浮点数对话框"),
                                         tr("请输入-1000到1000之间的数值"),0.00,-1000,1000,2,&ok);
    if(ok)
    {
        qDebug()<<"value2:"<<value2;
    }
​
    QStringList items;
    items<<tr("条目1")<<tr("条目2");
    //获取条目
    QString item=QInputDialog::getItem(this,tr("输入条目对话框"),
                                       tr("请选择或输入一个条目"),items,0,true,&ok);
    if(ok)
    {
        qDebug()<<"items:"<<item;
    }
}
​
//消息对话框
void Widget::on_pushButton_5_clicked()
{
    //问题对话框
    int ret1=QMessageBox::question(this,tr("问题对话框"),
                                   tr("你了解Qt吗?"),QMessageBox::Yes,QMessageBox::No);
    if(ret1==QMessageBox::Yes)
    {
        qDebug()<<tr("问题!");
    }
​
    //提示对话框
    int ret2=QMessageBox::information(this,tr("提示对话框"),
                                      tr("这是Qt书籍!"),QMessageBox::Ok);
    if(ret2==QMessageBox::Ok)
    {
        qDebug()<<tr("提示!");
    }
​
    //警告对话框
    int ret3=QMessageBox::warning(this,tr("警告对话框"),
                                  tr("不能提前结束!"),QMessageBox::Abort);
    if(ret3==QMessageBox::Abort)
    {
        qDebug()<<tr("警告!");
    }
​
    //错误对话框
    int ret4=QMessageBox::critical(this,tr("严重错误对话框"),
                                   tr("发现一个严重错误!现在要关闭所有文件!"),QMessageBox::YesAll);
    if(ret4==QMessageBox::YesAll)
    {
        qDebug()<<tr("错误");
    }
​
    //关于对话框
    QMessageBox::about(this,tr("关于对话框"),
                       tr("zyy"));
}
​
//进度对话框
void Widget::on_pushButton_6_clicked()
{
    QProgressDialog dialog(tr("文件复制进度"),tr("取消"),0,50000,this);
    dialog.setWindowTitle(tr("进度对话框"));
    dialog.setWindowModality(Qt::WindowModal);//将对话框设置为模态
    dialog.show();
    //演示复制进度
    for(int i=0;i<999999999;i++)
    {
        dialog.setValue(i);//设置进度条的当前值
        QCoreApplication::processEvents();//避免页面冻结
        if(dialog.wasCanceled())
        {
            break;
        }
        dialog.setValue(999999999);
        qDebug()<<tr("复制结束!");
    }
​
}
​
//错误消息对话框
void Widget::on_pushButton_7_clicked()
{
    errordlg->setWindowTitle(tr("错误信息对话框"));
    errordlg->showMessage(tr("这里是出错信息!"));
}
​
//3个向导页面
QWizardPage *Widget::createPage1()
{
    QWizardPage *page=new QWizardPage;
    page->setTitle(tr("介绍"));
    return page;
}
QWizardPage *Widget::createPage2()
{
    QWizardPage *page=new QWizardPage;
    page->setTitle(tr("用户信息选择"));
    return page;
}
QWizardPage *Widget::createPage3()
{
    QWizardPage *page=new QWizardPage;
    page->setTitle(tr("结束"));
    return page;
}
//向导对话框
void Widget::on_pushButton_8_clicked()
{
    QWizard wizard(this);
    wizard.setWindowTitle(tr("向导对话框"));
    wizard.addPage(createPage1());//添加向导页面
    wizard.addPage(createPage2());
    wizard.addPage(createPage3());
    wizard.exec();
}
#ifndef WIDGET_H
#define WIDGET_H
​
#include <QWidget>
#include <QErrorMessage>
#include <QWizardPage>
​
QT_BEGIN_NAMESPACE
namespace Ui { class Widget;class QErrorMessage; }
QT_END_NAMESPACE
​
class Widget : public QWidget
{
    Q_OBJECT
​
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
​
private slots:
    void on_pushButton_clicked();
​
    void on_pushButton_2_clicked();
​
    void on_pushButton_3_clicked();
​
    void on_pushButton_4_clicked();
​
    void on_pushButton_5_clicked();
​
    void on_pushButton_6_clicked();
​
    void on_pushButton_7_clicked();
​
    void on_pushButton_8_clicked();
​
private:
    Ui::Widget *ui;
​
    QErrorMessage *errordlg;//错误消息对话框
​
    //向导对话框
    QWizardPage *createPage1();
    QWizardPage *createPage2();
    QWizardPage *createPage3();
};
#endif // WIDGET_H

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值