• QT_QDialog 对话框


    QT_对话框
    建议参考

    1. 模态对话框,就是会阻塞同一应用程序中其它窗口的输入。
      模态对话框很常见,比如“打开文件”功能。你可以尝试一下记事本的打开文件,当打开文件对话框出现时,我们是不能对除此对话框之外的窗口部分进行操作的。
    1. 非模态对话框,例如查找对话框,我们可以在显示着查找对话框的同时,继续对记事本的内容进行编辑。

    对话框分类

    Qt 的内置对话框大致分为以下几类:

    1. QColorDialog: 选择颜色;
    2. QFileDialog: 选择文件或者目录;
    3. QFontDialog: 选择字体;
    4. QInputDialog: 允许用户输入一个值,并将其值返回;
    5. QMessageBox: 模态对话框,用于显示信息、询问问题等;
    6. QPageSetupDialog: 为打印机提供纸张相关的选项;
    7. QPrintDialog: 打印机配置;
    8. QPrintPreviewDialog:打印预览;
    9. QProgressDialog: 显示操作过程。

    自定义对话框
    Qt 支持模态对话框和非模态对话框。
    模态与非模态的实现:

    1. 使用QDialog::exec()实现应用程序级别的模态对话框
      
      • 1
    2. 使用QDialog::open()实现窗口级别的模态对话框
      
      • 1
    3. 使用QDialog::show()实现非模态对话框。
      
      • 1
    Qt 中使用QDialog类实现对话框。就像主窗口一样,我们通常会设计一个类继承QDialog。
    QDialog(及其子类,以及所有Qt::Dialog类型的类)的对于其 parent 指针都有额外的解释:
    如果 parent 为 NULL,则该对话框会作为一个顶层窗口,否则则作为其父组件的子对话框(此时,其默认出现的位置是 parent 的中心)。
    顶层窗口与非顶层窗口的区别在于:/*顶层窗口在任务栏会有自己的位置,而非顶层窗口则会共享其父组件的位置。*/
    	
    #include 
    #include 
    #include 
    #include 
    
    
    
        //点击新建菜单项,弹出对话框
        connect(ui->actionnew,&QAction::triggered,this,[=](){
    //        qDebug()<<"弹出对话框"<
            //对话框  有两种
            //模态对话框: 对话框开启状态不可以对其它窗口进行操作
            //非模态对话框:对话框开启状态是可以对其它窗口进行操作的
    
            //模态方式创建
    //        QDialog dlg(this);  // 父组件的子对话框。
    //        dlg.resize(200,100);
    //        dlg.exec();  //阻塞功能  应用程序级别      dlg创建到栈上,没有被释放掉是因为exec()阻塞。
    //        qDebug()<<"弹出对话框"<
    
            //非模态方式创建 ,不使用阻塞
    		//     QDialog dlg2(this);  //创建到栈上,不使用阻塞的话一闪而过
    //					 dlg2->show();  //不使用阻塞的话一闪而过。show函数之后该Lambda表达式结束退出,则dlg2局部对象被销毁。对话框消失。
    
    		//        QDialog * dlg2 = new QDialog(this); //new出来的this对象在堆上,创建成widget的children表(this),这样只有在widget窗口关闭时才会释放!!!只有this对象析构才会被释放,这里this是整个widget窗口。如果没有这个this依赖(QDialog * dlg2 = new QDialog),则创建的对象需要手动delete才能删除(delete QDialog)。
    //        dlg2->resize(200,100);
    //        dlg2->show();
    //        //设置dlg2的属性
    //        dlg2->setAttribute(Qt::WA_DeleteOnClose);  //点击对话框的关闭按钮时,释放掉该内存
    
    //设置标准对话框 QMessageBox
    //        QMessageBox::critical(this,"错误"," critical");
    //        QMessageBox::information(this,"信息"," info");
        //参数1 父亲, 2:标题  3:提示内容   4:按键类型  5:关联回车的按键
    //        QMessageBox::question(this,"询问对话框","question",QMessageBox::Save | QMessageBox::Cancel);
    //        if(QMessageBox::Save == QMessageBox::question(this,"询问对话框","question",QMessageBox::Save | QMessageBox::Cancel))
    //        {
    //            qDebug()<<"点击的是保存"<
    //        }
    //        else {
    //            qDebug()<<"点击的是取消"<
    //        }
    
    //选择颜色对话框
            QColor color_choose = QColorDialog::getColor(QColor(255,0,0));
            qDebug()<<color_choose.red()<<color_choose.blue()<<color_choose.green();
    
    //文件对话框,caption:标题   dir:路径  filter:显示哪些类型的文件(过滤功能)
    //        QFileDialog::getOpenFileName(this,"打开文件","D:\\00_MyDate\\QT","(*.txt *.png)");    //注意.修改为双斜杠
    //        QString  path = QFileDialog::getOpenFileName(this,"打开文件","D:\\00_MyDate\\QT","(*.txt *.png)");
    //        qDebug()<
    QString name = QFileDialog::getOpenFileName(this, QString::fromLocal8Bit("请选择视频文件")); //fromLocal8Bit  : 默认代码可能会中文出现乱码
        if (name.isEmpty())return; //如果没有选中文件,则name为空!
        string file = name.toLocal8Bit().data();  //中文转换, 非中文文件没问题。 中文则要通过toLocal8Bit转换为utf8格式。
    	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60

    1. 文件对话框的使用

    #include 
    #include 
    #include 
    //例程1
    QString curPath=QDir::currentPath();//获取系统当前目录
    //获取应用程序的路径
    QString dlgTitle="选择一个文件"; //对话框标题
    QString filter="文本文件(*.txt);;图片文件(*.jpg *.gif *.png);;所有文件(*.*)"; //文件过滤器
    QString aFileName=QFileDialog::getOpenFileName(this,dlgTitle,curPath,filter);
    if (!aFileName.isEmpty())
    ui->plainTextEdit->appendPlainText(aFileName);
    }
    
    //例程2
    void XVideoUI::Open()
    {
        QString name = QFileDialog::getOpenFileName(this, QString::fromLocal8Bit("请选择视频文件")); //fromLocal8Bit  : 默认代码可能会中文出现乱码
        if (name.isEmpty())return;
        string file = name.toLocal8Bit().data();  //中文转换, 非中文文件没问题。 中文则要通过toLocal8Bit转换为utf8格式。
        //QMessageBox::information(this, "", name);
        if (!XVideoThread::Get()->Open(file))
        {
            QMessageBox::information(this, "error", name + " open failed!");
            return;
        }
        Play(); //打开默认播放
    }
    //打开一号视频源文件
    static VideoCapture cap1;//一号视频源
    bool XVideoThread::Open(const std::string file)
    {
    	cout << "open :" << file << endl;
    	mutex.lock();
    	bool re = cap1.open(file);
    	mutex.unlock();
    	cout << re << endl;
    	if (!re)
    		return re;
    	fps = cap1.get(CAP_PROP_FPS); //获取fps
    	width = cap1.get(CAP_PROP_FRAME_WIDTH);  //获取视频的宽、高
    	height = cap1.get(CAP_PROP_FRAME_HEIGHT);
    	if (fps <= 0) fps = 25;  //万一没取到值。则取一个自定义值
    	src1file = file;  //打开时记录文件名
    	double count = cap1.get(CAP_PROP_FRAME_COUNT);
    	totalMs = (count / (double)fps) * 1000;  //总帧数/fps = 秒时长,  换算为毫秒
    	return true;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    2. 颜色对话框

    QColorDialog 对话框
    QColorDialog 是选择颜色对话框,选择颜色使用静态函数QColorDialog::getColor()。下面是
    “选择颜色”按钮的代码,它为文本框的字体选择颜色。

    void Dialog::on_btnColor_clicked()
    {
    	QPalette pal=ui->plainTextEdit->palette(); //获取现有palette
    	QColor iniColor=pal.color(QPalette::Text); //现有的文字颜色
    	QColor color=QColorDialog::getColor(iniColor,this,"选择颜色");
    	if (color.isValid()) //选择有效
    	{
    		pal.setColor(QPalette::Text,color); //palette 设置选择的颜色
    		ui->plainTextEdit->setPalette(pal); //设置palette
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    3. 字体对话框

    QFontDialog 是选择字体对话框,选择字体使用静态函数QFontDialog::getFont()。下面是“选
    择字体”按钮的代码,它为文本框选择字体,字体设置的内容包括字体名称、大小、粗体、
    斜体等。

    void Dialog::on_btnFont_clicked()
    {//选择字体
    	QFont iniFont=ui->plainTextEdit->font(); //获取文本框的字体
    	bool ok=false;
    	QFont font=QFontDialog::getFont(&ok,iniFont); //选择字体
    	if (ok) //选择有效
    	ui->plainTextEdit->setFont(font);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    4. 标准输入对话框

    QInputDialog 标准输入对话框
    QInputDialog 有单行字符串输入、整数输入、浮点数输入、列表框选择输入和多行文本等多种输入方式,图3 是其中4 种界面效果。

    void Dialog::on_btnInputString_clicked()
    { //输入字符串
    	QString dlgTitle="输入文字对话框";
    	QString txtLabel="请输入文件名";
    	QString defaultInput="新建文件.txt";
    	QLineEdit::EchoMode echoMode=QLineEdit::Normal;//正常文字输入
    	//QLineEdit::EchoMode echoMode=QLineEdit::Password;//密码输入
    	bool ok=false;
    	QString text = QInputDialog::getText(this, dlgTitle,txtLabel, echoMode,defaultInput, &ok);
    	if (ok && !text.isEmpty())
    	ui->plainTextEdit->appendPlainText(text);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    5. 消息对话框

    简单信息提示
    消息对话框QMessageBox 用于显示提示、警告、错误等信息,或进行确认选择,由几个静态函数实现这些功能。其中warning()、information()、critical() 和about() 这几个函数的输入参数和使用方法相同,只是信息提示的图标有区别。

    void Dialog::on_btnMsgInformation_clicked()
    {
    QString dlgTitle="information 消息框";
    QString strInfo="文件已经打开,字体大小已设置";
    QMessageBox::information(this, dlgTitle, strInfo,
    QMessageBox::Ok,QMessageBox::NoButton);
    }
    void Dialog::on_btnMsgWarning_clicked()
    {
    QString dlgTitle="warning 消息框";
    QString strInfo="文件内容已经被修改";
    QMessageBox::warning(this, dlgTitle, strInfo);
    }
    void Dialog::on_btnMsgCritical_clicked()
    {
    QString dlgTitle="critical 消息框";
    QString strInfo="有不明程序访问网络";
    QMessageBox::critical(this, dlgTitle, strInfo);
    }
    void Dialog::on_btnMsgAbout_clicked()
    {
    QString dlgTitle="about 消息框";
    QString strInfo="我开发的数据查看软件V1.0 \n 保留所有版权";
    QMessageBox::about(this, dlgTitle, strInfo);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    6. 自定义对话框

    继承自QDialog 对话框

    class QWDialogSize : public QDialog
    {
    	Q_OBJECT
    	public:
    	explicit QWDialogSize(QWidget *parent = 0);
    	~QWDialogSize();
    	int rowCount();//获取对话框输入的行数
    	int columnCount();//获取对话框输入的列数
    	void setRowColumn(int row, int column); //初始对话框上两个SpinBox 的值
    	private slots:
    	private:
    	Ui::QWDialogSize *ui;
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 相关阅读:
    大数据组件系列-Hadoop每日小问
    【Python】【Pyinstaller】打包过程问题记录及解决
    修改后的carrot_planner
    面试准备-软件工程
    从零到一python爬虫实战:框架选择>查找爬虫参数>写代码>打包运行
    java 注解编程
    计算机毕业设计django基于python平面地图监控(源码+系统+mysql数据库+Lw文档)
    编辑.htaccess文件执行任意代码(CVE-2022-25578)
    Linux串口设备的使用<ubuntu>
    Sentinel安装
  • 原文地址:https://blog.csdn.net/qq_20467929/article/details/126079012