草庐IT

QT—5种标准对话框使用详解

霸道小明 2023-06-05 原文

对话框是 GUI 程序中不可或缺的组成部分。一些不适合在主窗口实现的功能组件都必须放在对话框中设置。对话框通常会是一个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁的用户交互。所谓标准对话框,是 Qt 内置的一系列对话框,用于简化开发。事实上,有很多对话框都是通用的,比如打开文件、设置颜色、打印设置等。这些对话框在所有程序中几乎相同。

Qt常用的内置对话框有QFileDialog、QColorDialog、QFontDialog、QInputDialog和QMessageBox。下面对这些对话框做一些简单示例。

对话框类

说明

静态函数

函数说明

QFileDialog

文件对话框

getOpenFileName()

选择打开一个文件

getOpenFileNames()

 选择打开多个文件

getSaveFileName()

选择保存一个文件

getExistingDirectory()

选择一个己有的目录

getOpenFileUrl()

选择打幵一个文件,可选择远程网络文件

QColorDialog

颜色对话框

getColor()

选择颜色

QFontDialog

字体对话框

QFont getFont()

选择字体

QInputDialog

输入对话框

getText()

输入单行文字  

getlnt()

输入整数

getDouble()

输入浮点数

getltem()

从一个下拉列表框中选择输入

getMultiLineText()

输入多行字符串

QMessageBox

消息框

information()

信息提示对话框

question()

询问并获取是否确认的对话框

waming()

警告信息提示对话框

critical()

错误信息提示对话框

about()

设置自定义信息的关于对话框

aboutQt()

关于Qt的对话框

QFileDialog文件对话框 

文件对话框可以通过调用QFileDialog::getOpenFileName方法实现,方法的第一个参数指定窗体的父窗体、第二个参数指定窗体的标题、第三个参数指定窗体的打开目录、第四个参数用于限定打开的文件类型,有多个类型时中间用;;隔开。下面程序演示了当用户点击按钮后会弹出文件对话框,之后将用户选择的文件路劲显示在文本框中。

//文件对话框
void Dialog::ShowFileDlg()
{
    //打开文件对话框
    //函数返回打开的路径
    QString sPath = QFileDialog::getOpenFileName(
                this,//指定父窗口
                "标准文件对话框",//打开文件对话框的标题
                ".",//打开目录,"." 表示当前目录
                "C++ files(*.cpp);;"
                 "C files(*.c);;"
                "Header files(*.h)"//设置文件过滤器,有多个条件时中间以两个;;隔开
                );
    m_fileEdit->setText(sPath);
}

m_fileEdit是一个QLineEdit部件名,用来显示用户打开文件的路径。 

 QColorDialog颜色对话框

颜色对话框可以通过调用QColorDialog::getColor方法实现,方法的第一个参数表示默认选择的颜色。该方法会返回一个颜色类。

void Dialog::ShowColorDlg()
{
    QColor color = QColorDialog::getColor(
                Qt::yellow//默认选择的颜色
                );
    //判断颜色选择是否合法
    if(color.isValid()){
        //设置边宽颜色
        m_colorFrame->setPalette(QPalette(color));
    }
}

 m_colorFram是一个QFrame类型,用来展示用户选择的颜色

QFontDialog字体对话框

字体对话框可以通过调用QFontDialog::getFont方法实现,该方法需要传入一个bool类型的参数用来接收函数是否成功执行,方法会返回一个字体字体类。

//字体对话框
void Dialog::ShowFontDlg()
{
    bool ok;//接收函数是否执行成功
    QFont font = QFontDialog::getFont(
                    &ok//接收函数是否执行成功
                );
    if(ok){
        //设置字体
        m_fontEdit->setFont(font);
    }
}

 m_fontEdit是一个QLineEdit类型,用来展示用户选择的字体效果

QInputDialog输入对话框

设置姓名,可以调用的是QInputDialog::getText( )方法用来获取输入的单行文本。方法的第一个参数指定父窗体,第二个参数指定对话框的标题,第三个参数指定对话框显示的内容,第四个参数纸档输入框的模式,第五个参数指定默认值,第六个参数是一个bool类型用来接收函数是否执行成功。

//文本输入对话框
void InputDlg::editName(){
    bool ok;
    QString strName = QInputDialog::getText(
                this,//指定父窗体
                "标准文本输入对话框",//指定对话框标题
                "请编辑姓名",//提示字符串
                QLineEdit::Normal,//输入框显示模式
                m_nameLabel->text(),//输入框的默认文本
                &ok//接收函数调用是否成功
                //最后一个参数表示窗体风格,这里采用默认的
                );
    if(ok && !strName.isEmpty()){
        m_nameLabel->setText(strName);
    }

}

设置性别,可以调用的是QInputDialog::getItem( ) 方法用来获取用户从下拉列表选择的值。QInputDialog第三个参数用来设置下拉列表框,要传入一个QStringList类型的值。

//条目输入对话框
void InputDlg::editSex(){
    QStringList sexList;
    bool ok;
    sexList<<"男"<<"女"<<"未知";
    //可选项是QString 类型,接收也是QString
    QString strSex = QInputDialog::getItem(
                this,
                "标准条目输入对话框",//指定对话框标题
                "请选择性别",    //指定显示内容
                sexList,//设置可选项,可选项是一个QStringList类型
                0,//设置默认选选项
                false,//是否可编辑
                &ok//接收函数是否调用成功
                );
    if(ok && !strSex.isEmpty()){
        m_sexLabel->setText(strSex);
    }
}

设置年龄,可以调用QInputDialog::getInt方法用来获取用户填入的整数值。getInt方法的第四个参数和第五个参数分别用来设置整数的最小值和最大值,第六个参数用来设置步长,即点击增加按钮时每次增加的值。

void InputDlg::editAge(){
    bool ok;
    int age = QInputDialog::getInt(
                this,
                "标注int数据类型输入对话框",//对话框标题
                "请编辑年龄",//对话框显示的内容
                m_ageLabel->text().toInt(),//默认值
                0,//最小值
                120,//最大值
                1,//步长
                &ok//接收函数是否调用成功
                );
    if(ok){
        m_ageLabel->setText(QString("%1").arg(age));
    }
}

设置分数,可以调用QInputDialog::getDouble方法用来获取用户填入的浮点数值。getDouble方法的第四个参数和第五个参数分别用来设置整数的最小值和最大值,第六个参数用来设置精度,即点数据的小数位。

void InputDlg::editScore(){
    bool ok;
    double score = QInputDialog::getDouble(
                this,//设置父窗体
                "标准double数据类型输入对话框",//对话框标题
                "请编辑分数",//对话框显示的内容
                m_scoreLabel->text().toDouble(),//默认值
                0,//最小值
                100,//最大值
                1,//精度
                &ok//接收函数是否执行成功
                );
    if(ok){
        m_scoreLabel->setText(QString::number(score));
    }
}

QMessageBox消息框

问题消息框,可以调用QMessageBox::question() 显示问题消息框,问题消息框可设置要显示的按钮,方法会返回一个枚举类型表示用户所点击的按钮。这里设置的是“确定”和“取消”按钮。

void MsgBoxDlg::showQuestionMsgDlg() {
    m_tipLabel->setText("问题消息框");
    int res = QMessageBox::question(
                this,//指定父窗体
                "问题消息框",//指定标题
                "已打开问题消息框,是否关闭?",//显示的文本
                QMessageBox::Ok|QMessageBox::Cancel,//标注按钮
                QMessageBox::Ok//默认选择的按钮
                );
    switch (res) {
    case QMessageBox::Ok:
        m_tipLabel->setText("问题消息框 - 确定");
        break;
    case QMessageBox::Cancel:
        m_tipLabel->setText("问题消息框 - 取消");
        break;
    default:
        break;
    }
}

信息消息框,可以调用QMessageBox::information( )方法实现,信息消息框的作用是给用户展示一段消息,无需用户做出操作,函数参数也比较简单。

void MsgBoxDlg::showInformationMsgDlg() {
    m_tipLabel->setText("信息消息框");
    QMessageBox::information(
                this,//父窗体
                "信息提示框",//标题
                "这是个信息提示框"//文本内容
                );
}

警告消息框,可以调用QMessageBox::waring方法,警告消息框同样可以设置消息框的按钮,方法会一个枚举类型表示用户的操作。这里设置的是“保存”、“忽视”和“取消”按钮。

void MsgBoxDlg::showWarningMsgDlg() {
    m_tipLabel->setText("警告消息框");
    int res = QMessageBox::warning(
                this,//父窗体
                "警告消息框",//标题
                "有为保存的文件",//警告内容
                QMessageBox::Save|QMessageBox::Discard|QMessageBox::Cancel,
                QMessageBox::Save//默认选择的按钮
                );
    switch (res) {
    case QMessageBox::Save:
        m_tipLabel->setText("警告提示框 - 保存");
        break;
    case QMessageBox::Discard:
        m_tipLabel->setText("警告提示框 - 忽视");
        break;
    case QMessageBox::Cancel:
        m_tipLabel->setText("警告提示框 - 取消");
        break;
    default:
        break;
    }
}

错误消息框,可以调用QMessageBox::critical方法,错误消息框也相当于一种消息提醒,会比信息消息框的效果显目,调用方法和信息消息框类似。

void MsgBoxDlg::showCriticalMsgDlg() {
    m_tipLabel->setText("错误消息框");
    QMessageBox::critical(
                this,//父窗体
                "错误消息框",//标题
                "发生重大错误!!"//显示内容
                );
}

关于消息框,调用QMessageBox::about方法,关于消息框也是一种消息提醒,调用方法与信息消息框类似。

void MsgBoxDlg::showAboutMsgDlg() {
    m_tipLabel->setText("关于消息框");
    QMessageBox::about(
                this,//父窗体
                "关于消息框",//标题
                "这是个关于休斯顿的信息"//显示内容
                );
}

关于QT消息框,调用QMessageBox::aboutQt方法,关于QT消息框会弹出一个有关QT的信息。其他功能暂无。

void MsgBoxDlg::showAboutQtMsgDlg() {
    m_tipLabel->setText("关于QT消息框");
    QMessageBox::aboutQt(
                this,//父窗体
                "关于QT消息框"//标题
                );
}

自定义消息框

自定义消息框设置了一个图标和三个按钮,其中两个按钮采用自定义形式,另一个按钮采用标准形式,当用户点击按钮后,从对话框中获取用户点击的按钮,然后显示出对应的文本。

//自定义消息框
void Dialog::ShowCustomDlg() {
    m_customLabel->setText("自定义消息框");
    QMessageBox customMsgBox;
    customMsgBox.setWindowTitle("自定义消息框");
    //返回一个按钮对象
    //自定义按钮
    QPushButton *yes = customMsgBox.addButton(
                "真的吗?",//指定文本
                QMessageBox::ActionRole//指定角色
                );
    //自定义按钮
    QPushButton *no = customMsgBox.addButton(
                "假的",//指定文本
                QMessageBox::ActionRole//指定角色
                );
    //标准按钮
    QPushButton *cancel = customMsgBox.addButton(
                QMessageBox::Cancel);
    //设置图标
    customMsgBox.setIconPixmap(QPixmap("msg.jpg"));
    customMsgBox.exec();
    if(customMsgBox.clickedButton()==yes){
        m_customLabel->setText("点了“真的吗?”");
    }else if(customMsgBox.clickedButton()==no){
        m_customLabel->setText("点了“假的   ”");
    }else if(customMsgBox.clickedButton()==cancel){
        m_customLabel->setText("点了“取消”");
    }

}

 追风赶月莫停留,平芜尽处是春山!!!

有关QT—5种标准对话框使用详解的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  4. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  5. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  6. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  7. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  8. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  9. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  10. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

随机推荐