C++ | Qt QDialog自定义对话框及标准对话框

19 篇文章 5 订阅

目录

一、自定义对话框

二、标准对话框 

1.QMessageBox

自定义QMessageBox

2.QColorDialog

3.QFileDialog

4.QFontDialog

5.QInputDialog

6.QPageSetupDialog

7.QPrintDialog

8.QPrintPreviewDialog

9.QProgressDialog


一、自定义对话框

QDialog(及其子类,如QMessageDialog,以及所有Qt::Dialog类型的类)对于其 parent 指针都有额外的解释:如果 parent 为 NULL,则该对话框会作为一个顶层窗口;否则作为其父组件的子对话框(此时,其默认出现的位置是 parent 的中心)。顶层窗口与非顶层窗口的区别在于,顶层窗口在任务栏会有自己的位置,而非顶层窗口则会共享其父组件的位置。

对话框分为模态对话框和非模态对话框。

  • 模态对话框:会阻塞同一应用程序中其它窗口的输入,操作其他窗口前需要关闭该对话框。

1.使用QDialog::exec()实现应用程序级别的模态对话框【当该种模态的对话框出现时,用户必须首先对对话框进行交互,直到关闭对话框,然后才能访问程序中其他的窗口】。

2.使用QDialog::open()实现窗口级别的模态对话框【该模态仅仅阻塞与对话框关联的窗口,但是依然允许用户与程序中其它窗口交互。窗口级别的模态尤其适用于多窗口模式】。

  • 非模态对话框:允许在显示该对话框的同时,继续对其他窗口的内容进行编辑,如查找对话框。

1.使用QDialog::show()实现非模态对话框。

    //点击新建按钮,创建模态对话框
    connect(ui->actionnew,&QAction::triggered,this,[this](){
        QDialog *dialog=new QDialog(this);
        //当主窗口不关闭,即不进行析构时,多次打开关闭对话框会导致内存泄漏
        dialog->setAttribute(Qt::WA_DeleteOnClose);//防止内存泄漏
        dialog->resize(300,200);
        dialog->setToolTip("这是个ToolTip");
        dialog->setWindowIcon(QIcon(":new/texture/Images/Sunny.jpg"));
        dialog->setWindowTitle("原生对话框");
        dialog->exec();
    });

    //点击编辑按钮,创建非模态对话框
    connect(ui->actionedit,&QAction::triggered,this,[this](){
        //在堆上创建dialog
        QDialog *dialog=new QDialog(this);
        dialog->setAttribute(Qt::WA_DeleteOnClose);//防止内存泄漏
        dialog->show();

        //在栈上创建dialog,一闪而过
        QDialog dialog1(this);
        dialog1.show();
     });

二、标准对话框 

标准对话框,是 Qt 内置的一系列对话框,用于简化开发。事实上,有很多对话框都是通用的,比如打开文件、设置颜色、打印设置等。这些对话框在所有程序中几乎相同,因此没有必要在每一个程序中都自己实现这么一个对话框。Qt 的内置对话框大致分为以下几类:

1.QMessageBox

QMessageBox是模态消息对话框,用于显示信息、询问问题等。

        QMessageBox::about(this,"关于对话框","这时一个about对话框");
        QMessageBox::aboutQt(this,"Qt About");
        //严重错误对话框
        QMessageBox::critical(this,"错误","这是个错误弹窗");
        //提问对话框 利用返回值判断用户按键类型
        if(QMessageBox::Save==QMessageBox::question(this,"提问","要保存吗?",QMessageBox::Save|QMessageBox::No,QMessageBox::No)){
            //信息对话框
            QMessageBox::information(this,"提示","保存成功");
        }else{
            //警告对话框
            QMessageBox::warning(this,"警告","未保存");
        }

   

  

自定义QMessageBox

        QMessageBox *myBox=new QMessageBox(this);
        myBox->setIcon(QMessageBox::Information);
        myBox->setText("我吹过你吹过的晚风~");
        myBox->setStandardButtons(QMessageBox::Ok|QMessageBox::Cancel);
        myBox->setDefaultButton(QMessageBox::Ok);
        myBox->addButton(QMessageBox::Save);
        myBox->setButtonText(QMessageBox::Ok,"确定");
        myBox->setWindowTitle("歌词");
        myBox->setDetailedText("详细信息:\n我吹过你吹过的晚风\n那我们算不算 相拥\n可如梦初醒般的两手空空\n心也空");
        myBox->setInformativeText("描述信息:\n《错位时空》");
        int ret = myBox->exec();
        switch (ret)
        {
        case QMessageBox::Save:
            qDebug() << "Save!";
            break;
        case QMessageBox::Ok:
            qDebug() << "Ok!";
            break;
        case QMessageBox::Cancel:
            qDebug() << "cancel!";
            break;
        }

  

2.QColorDialog

 QColorDialog对话框是模态颜色对话框。

        //颜色对话框 第一个参数为默认选的颜色
        QColor color=  QColorDialog::getColor(QColor(255,0,0),this,"选择颜色",QColorDialog::ShowAlphaChannel);
        //修改label颜色
        QPalette palette;
        palette.setColor(QPalette::WindowText,color);
        ui->label->setPalette(palette);

3.QFileDialog

QFileDialog是选择文件对话框。If you want multiple filters, separate them with ';;':

QString filepath= QFileDialog::getOpenFileName(this,"打开文件","C:\\Users\\fengchujun\\Downloads","txtFile(*.txt);;exeFile(*.exe)");
        qDebug()<<filepath;
    QAction *actionOpenFile=new QAction(QIcon(":new/texture/Images/sunny.png"),"打开文件",this);
    QAction *actionSaveFile=new QAction(QIcon(":new/texture/Images/butterfly.png"),"保存文件",this);
    QMenu *menu=menuBar()->addMenu("操作文件");
    menu->addAction(actionOpenFile);
    menu->addAction(actionSaveFile);

    QTextEdit *edit=new QTextEdit("文本框",this);
    setCentralWidget(edit);

    connect(actionOpenFile,&QAction::triggered,this,[=](){
        //文件对话框
        QString filepath= QFileDialog::getOpenFileName(this,"打开文件","C:\\Users\\fengchujun\\Downloads","*.txt");
        qDebug()<<filepath;
        if(filepath.isEmpty())
        {
            QMessageBox::warning(this,"提示","您未选择文件");

        }else{
            QFile file(filepath);
            if( file.open(QIODevice::ReadOnly))
            {
                QTextStream in(&file);
                edit->setText(in.readAll());
                file.close();
            }else{
                QMessageBox::warning(this,"提示","文件不可读");

            }
        }
    });
    connect(actionSaveFile,&QAction::triggered,this,[=](){
        //文件对话框
        QString filepath= QFileDialog::getOpenFileName(this,"打开文件","C:\\Users\\fengchujun\\Downloads","*.txt");
        qDebug()<<filepath;
        if(filepath.isEmpty())
        {
            QMessageBox::warning(this,"提示","您未选择文件");
        }else{
            QFile file(filepath);
            if( file.open(QIODevice::WriteOnly))
            {
                QTextStream in(&file);
                in<<"helloworld";
                file.close();
            }else{
                QMessageBox::warning(this,"提示","文件不可写");

            }
        }
    });

4.QFontDialog

QFontDialog是选择字体对话框。

    bool ok;
    QFont font=  QFontDialog ::getFont(&ok,QFont("黑体",24),this,"选择字体");
    if(ok)
    {
        qDebug()<<"点击了OK";
    }else{
        qDebug()<<"点击了Cancel";
    }
    qDebug()<<font.family()<<font.pointSize()<<font.bold();//字体 字号 是否加粗

5.QInputDialog

QInputDialog输入对话框,允许用户输入或者选择一个值(整数、浮点数、字符串、列表选项),并将其值返回。

    QInputDialog *inputDialog_int=new QInputDialog(this);
    bool getAge;
    int age= inputDialog_int->getInt(this,"输入年龄","年龄",22,1,110,1,&getAge);
    if(getAge)
    {
        qDebug()<<"年龄:"<<age;
    }

    QInputDialog *inputDialog_item=new QInputDialog(this);
    QStringList list;
    list<<"春天"<<"夏天"<<"秋天"<<"冬天";
    bool getItem;
    QString  season= inputDialog_item->getItem(this,"选择季节","季节",list,0,false,&getItem);
    if(getItem)
    {
        qDebug()<<"季节:"<<season;
    }

    QInputDialog *inputDialog_text=new QInputDialog(this);
    bool getInfo;
    QString info= inputDialog_text->getText(this,"密码","输入密码",QLineEdit::Password,"",&getInfo);
    if(getInfo)
    {
        qDebug()<<"密码:"<<info;
    }

  

6.QPageSetupDialog

QPageSetupDialog为打印机提供纸张相关的选项。

注意:需要在.pro文件添加printsupport库:QT += printsupport

    QPrinter *printer=new QPrinter();
    QPageSetupDialog * pageSetUpDialog=new QPageSetupDialog(printer,this);
    if(pageSetUpDialog->exec()==QDialog::Accepted){
        int ret=printer->pageSize();
        QPrinter::ColorMode mode=  printer->colorMode();

        QPageLayout layout=printer->pageLayout();
        qDebug()<<"纸张大小:"<<ret<<"颜色模式:"<<mode<<layout;

    }

7.QPrintDialog

QPrintDialog 打印机配置

8.QPrintPreviewDialog

QPrintPreviewDialog 打印预览;

9.QProgressDialog

QProgressDialog 进度条对话框。

    QProgressDialog *progressDialog=new QProgressDialog("进度","Cancel",0,100,this);
    int value=0;
    progressDialog->setValue(0);

    QPushButton *btn=new QPushButton("控制进度条",this);
    connect(btn,&QPushButton::clicked,this,[=]()mutable{
        if(progressDialog->value()<100)
        {
            value+=10;
            progressDialog->setValue(value);
        }
    });

    progressDialog->exec();

  • 14
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烫青菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值