范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Qt菜单栏和对话框

  引言
  QMainWindow 是一个为用户提供主窗口程序的类,包含一个菜单栏(menu bar)、多个工具栏(tool bars)、多个锚接部件(dock widgets)、一个状态栏(status bar)及一个中心部件(central widget),是许多应用程序的基础,如文本编辑器,图片编辑器等。(本篇主要介绍菜单栏和工具栏)
  一、菜单栏
  一个主窗口最多只有一个菜单栏。位于主窗口顶部、主窗口标题栏下面。 创建菜单栏 QMenuBar  *   menuBar   =     new     QMenuBar  (  this  );  创建菜单,调用 QMenu 的成员函数 addMenu 来添加菜单QAction* addMenu(QMenu * menu) QMenu* addMenu(const QString & title) QMenu* addMenu(const QIcon & icon, const QString & title)创建菜单项,调用 QMenu 的成员函数 addAction 来添加菜单项 QAction* activeAction() QAction* addAction(const QString & text) QAction* addAction(const QIcon & icon, const QString & text) QAction* addAction(const QString & text, const QObject * receiver, const char * member, const QKeySequence & shortcut = 0) QAction* addAction(const QIcon & icon, const QString & text, const QObject * receiver, const char * member,const QKeySequence & shortcut = 0)实例演示:(vs2019+qt5) //创建菜单栏     QMenuBar* menuBar = new QMenuBar(this); //创建菜单(用addMenu方法添加入菜单栏)     QMenu* filename = menuBar->addMenu(QStringLiteral("文件(&F)")); //创建菜单项     QAction* openfile = new QAction(QStringLiteral("打开文件(&O)"));     QAction* opendlg = new QAction(QStringLiteral("打开对话框(&D)")); //给菜单项添入图标     openfile->setIcon(QIcon(":/D:/image/Luffy.png"));     opendlg->setIcon(QIcon(":/D:/image/LuffyQ.png")); //用addAction加入菜单项     filename->addAction(opendlg);     filename->addAction(openfile);
  注意:使用  QStringLiteral  宏可以在编译期把代码里的常量字符串 str 直接构造为 QString 对象,于是运行时就不再需要额外的构造开销了。 资源文件的添加
  openfile->setIcon(QIcon(":/D:/image/Luffy.png"));
  对于该句代码":/D:/image/Luffy.png"是以相对路径添加的(即以:/开头的是资源文件),那么如何添加资源文件呢? 添加->新建项->Qt->Qt Resource File。
  在Resource1.qrc中添加说需要的资源(比如图片)
  最后以 冒号+前缀+名称(相对路径) 写入资源。 二、工具栏
  主窗口的工具栏上可以有多个工具条,通常采用一个菜单对应一个工具条的的方式,也可根据需要进行工具条的划分。
  添加头文件 直接调用 QMainWindow 类的 addToolBar()函数获取主窗口的工具条对象,每增加一个工具条都需要调用一次该函数 插入属于工具条的动作,即在工具条上添加操作。通过 QToolBar 类的 addAction 函数添加 工具条是一个可移动的窗口,它的停靠区域由 QToolBar 的 allowAreas 决定,包括: Qt::LeftToolBarArea 停靠在左侧 Qt::RightToolBarArea停靠在右侧 Qt::TopToolBarArea 停靠在顶部 Qt::BottomToolBarArea停靠在底部 Qt::AllToolBarAreas以上四个位置都可停靠
  使用 setAllowedAreas()函数指定停靠区域: setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea)
  使用 setMoveable()函数设定工具栏的可移动性: setMoveable(false)//工具条不可移动, 只能停靠在初始化的位置上三、对话框 QDialog
  对话框是 GUI 程序中不可或缺的组成部分。很多不能或者不适合放入主窗口的功能组件都必须放在对话框中设置。对话框通常会是一个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁的用户交互。
  Qt 中使用 QDialog 类实现对话框。就像主窗口一样,我们通常会设计一个类继承 QDialog。QDialog(及其子类,以及所有 Qt::Dialog 类型的类)的对于其parent 指针都有额外的解释: 如果 parent 为 NULL,则该对话框会作为一个顶
  层窗口,否则则作为其父组件的子对话框(此时,其默认出现的位置是 parent的中心)。
  顶层窗口与非顶层窗口的区别在于,顶层窗口在任务栏会有自己的位置,而非顶层窗口则会共享其父组件的位置。
  Qt的内置对话框大致分为以下几类: QColorDialog: 选择颜色 QFileDialog: 选择文件或者目录 QFontDialog: 选择字体 QInputDialog: 允许用户输入一个值,并将其值返回 QMessageBox:模态对话框,用于显示信息、询问问题,消息,警告,错误。 QPageSetupDialog:为打印机提供纸张相关的选项 QPrintDialog:打印机配置 QPrintPreviewDialog:打印预览 QProgressDialog:显示操作过程 1 对话框分为模态对话框和非模态对话框。模态对话框,就是会阻塞同一应用程序中其它窗口的输入。模态对话框很常见,比如"打开文件"功能。你可以尝试一下记事本的打开文件,当打开文件对话框出现时,我们是不能对除此对话框之外的窗口部分进行操作的。 与此相反的是非模态对话框,例如查找对话框,我们可以在显示着查找对话框的同时,继续对记事本的内容进行编辑。 模态与非模态的实现:使用 QDialog::exec()实现应用程序级别的 模态对话框 当该种模态的对话框出现时,用户必须首先对对话框进行交互,直到关闭对话框,然后才能访问程序中其他的窗口。 使用 QDialog::open()实现窗口级别的 模态对话框 该模态仅仅阻塞与对话框关联的窗口,但是依然允许用户与程序中其它窗口交互。 窗口级别的模态尤其适用于多窗口模式。 使用 QDialog::show()实现 非模态对话框
  模态对话框实例:
  我们调用了 exec()将对话框显示出来,因此这就是一个模态对话框。当对话框出现时,我们不能与主窗口进行任何交互,直到我们关闭了该对话框。 QDialog dlg1(this); dlg1.resize(300,200); dlg1.setWindowTitle(QStringLiteral("模态对话框")); dlg1.exec();
  非模态对话框实例:
  下面我们试着将 exec()修改为 show(),看看非模态对话框: QDialog dlg1(this); dlg1.resize(300,200); dlg1.setWindowTitle(QStringLiteral("模态对话框")); dlg1.show();
  是不是事与愿违?对话框竟然一闪而过!这是因为,show()函数不会阻塞当前线程,对话框会显示出来,然后函数立即返回,代码继续执行。注意,dialog 是建立在栈上的,show()函数返回,函数结束,dialog超出作用域被析构,因此对话框消失了。知道了原因就好改了,我们将  dialog改成堆上建立(即new一个对象) ,当然就没有这个问题了。 QDialog *dlg2 = new QDialog(); dlg2->resize(200, 200); dlg2->setAttribute(Qt::WA_DeleteOnClose);//关闭时清理内存 dlg2->show();
  注意:在堆上就不能用点(.)了,要用->。而且由于使用 new 在堆上分配空间,却一直没有 delete。因此我们用setAttribute()函数设置对话框关闭时,自动销毁对话框。 2 消息对话框 (QMessageBox)
  QMessageBox :模态对话框,用于显示信息、询问问题等;我们一般会使用该类提供的几个 static成员函数:(静态成员函数有两种访问方式:1 创建对象 ;2 直接通过类名去调用) 显示关于对话框 void   about  (  QWidget     *   parent  ,     const     QString     &   title  ,     const     QString     &   text  )  这是一个最简单的对话框,其标题是 title,内容是 text,父窗口是parent。对话框只有一个 OK 按钮。显示错误对话框StandardButton critical(QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButton defaultButton = NoButton)这个对话框将显示一个红色的错误符号。我们可以通过 buttons 参数指明其显示的按钮 。 默认情况下只有一个Ok按钮 ,我们可以使用StandardButtons 类型指定多种按钮,指令如下:
  示例: QMessageBox::critical(this, QStringLiteral("error"), QStringLiteral("错误"),QMessageBox::No);
  第一个参数是 父类,第二个是标题,第三个是内容,第四个是按钮名称(类型为StandardButtons,可以有两个做选择),第五个参数是默认(按钮类型为StandardButtons)。
  显示信息对话框 StandardButton information(QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButton defaultButton = NoButton)
  ** 示例:** QMessageBox::information(this, QStringLiteral("信息"), "infor", QMessageBox::Ok);
  显示问题对话框 StandardButton question(QWidget * parent, const QString & title,const QString & text, StandardButtons buttons = StandardButtons( Yes | No ), StandardButton defaultButton = NoButton)
  示例: //获取点击信息 if (QMessageBox::Yes== QMessageBox::question(this, QStringLiteral("问题"), "question", QMessageBox::Yes | QMessageBox::No, QMessageBox::No))         {             qDebug() << "click yes";         }         else         {             qDebug() << "click no";          }
  3 标准文件对话框
  QFileDialog,也就是文件对话框。
  我们使用 QFileDialog::getOpenFileName()来获取需要打开的文件的路径。这个函数原型如下: QString getOpenFileName(QWidget * parent = 0,                //父窗口                         const QString & caption = QString(), //对话框标题                         const QString & dir = QString(),     //对话框打开的默认路径                         const QString & filter = QString(),  //过滤器(例如我们使用"imagefile(*.jpg*.png)"则只显示jpg和png文件。多个过滤器用";;"分割。                         QString * selectedFilter = 0,        //默认选择的过滤器                         Options options = 0                  //对话框的参数设定                        )
  QFileDialog::getOpenFileName()返回值是选择的文件路径。我们将其赋值给path。通过判断 path 是否为空,可以确定用户是否选择了某一文件。只有当用户选择了一个文件时,我们才执行下面的操作。
  下面是最主要的 openFile()和 saveFile()这两个函数的代码: //打开文件  void MainWindow::openFile() {  QString path = QFileDialog::getOpenFileName(this, tr("Open File"), ".", tr("Text Files(*.txt)"));  if(!path.isEmpty())  {  QFile file(path);  if (!file.open(QIODevice::ReadOnly | QIODevice::Text))  {  QMessageBox::warning(this, tr("Read File"), tr("Cannot open file: %1").arg(path));  return;  } QTextStream in(&file);  textEdit->setText(in.readAll());  file.close();  } else  {  QMessageBox::warning(this, tr("Path"), tr("You did not select any file."));  }  }//保存文件  void MainWindow::saveFile()  {  QString path = QFileDialog::getSaveFileName(this, tr("Open File"), ".", tr("Text Files(*.txt)"));  if(!path.isEmpty())  {  QFile file(path); if (!file.open(QIODevice::WriteOnly | QIODevice::Text))  {  QMessageBox::warning(this, tr("Write File"), tr("Cannot open file: %1").arg(path));  return;  } QTextStream out(&file);  out << textEdit->toPlainText();  file.close();  } else  {  QMessageBox::warning(this, tr("Path"), tr("You did not select any file."));   } }4 其他对话框颜色对话框 QColor color= QColorDialog::getColor(QColor(255, 0, 0));//设置默认颜色:红色,用color接收选取的颜色字体对话框bool flag; QFont font = QFontDialog::getFont(&flag, QFont("华文彩云", 36));演示示例
  在菜单栏中打开上述对话框,并制定界面。 #include "aaa.h" #include"qmenubar.h" #include"qdialog.h" #include"qfiledialog.h" #include"qtoolbar.h" #include"qmessagebox.h" #include"qdebug.h" #include"qcolordialog.h" #include"qfontdialog.h"  aaa::aaa(QWidget *parent)     : QWidget(parent) {      //菜单文件     // 使用 QStringLiteral 宏可以在编译期把代码里的常量字符串 str 直接构造为 QString 对象,于是运行时就不再需要额外的构造开销了。     QMenuBar* menuBar = new QMenuBar(this);     QMenu* filename = menuBar->addMenu(QStringLiteral("文件(&F)"));     QAction* openfile = new QAction(QStringLiteral("打开文件(&O)"));     QAction* opendlg = new QAction(QStringLiteral("打开对话框(&D)"));     QAction* openmessage = new QAction(QStringLiteral("打开消息对话框(&D)"));     QAction* opencolor = new QAction(QStringLiteral("打开颜色对话框(&D)"));     QAction* openfont = new QAction(QStringLiteral("打开字体对话框(&D)"));      //设置图标     opencolor->setIcon(QIcon(":/D:/image/sunny.png"));     openfile->setIcon(QIcon(":/D:/image/Luffy.png"));     opendlg->setIcon(QIcon(":/D:/image/LuffyQ.png"));     openmessage->setIcon(QIcon(":/D:/image/up.png"));     openfont->setIcon(QIcon(":/D:/image/sunny.png"));      //加入主菜单     filename->addAction(openmessage);     filename->addAction(opendlg);     filename->addAction(openfile);     filename->addAction(opencolor);     filename->addAction(openfont);      //打开对话框     connect(opendlg, &QAction::triggered, [=]() {         //模态对话框(不可对其他对话框操作)         QDialog dlg1(this);         dlg1.resize(300,200);         dlg1.setWindowTitle(QStringLiteral("模态对话框"));         dlg1.exec();         //非模态对话框(可以对其他对话框操作)        // QDialog *dlg2 = new QDialog();         //dlg2->resize(200, 200);         //dlg2->setAttribute(Qt::WA_DeleteOnClose);//关闭时清理内存         //dlg2->show();         });      //打开文件     connect(openfile, &QAction::triggered, [=]() {         QFileDialog fdlg(this);         fdlg.getOpenFileName(this, QStringLiteral("选择文件"), "D:", tr("Image(*.jpg*.png)"));          });      //打开消息对话框     connect(openmessage, &QAction::triggered, [=]() {         if (QMessageBox::Yes== QMessageBox::question(this, QStringLiteral("问题"), "question", QMessageBox::Yes | QMessageBox::No, QMessageBox::No))         {             qDebug() << "click yes";         }          else         {             qDebug() << "click no";          }         });     //打开颜色对话框     connect(opencolor, &QAction::triggered, [=]() {         QColor color=    QColorDialog::getColor(QColor(255, 0, 0));//设置默认颜色:红色,用color接收选取的颜色         });      //打开字体对话框     connect(openfont, &QAction::triggered, [=]() {         bool flag;         QFont font = QFontDialog::getFont(&flag, QFont("华文彩云", 36));         qDebug() << QStringLiteral("字体") << font.family() << QStringLiteral("字号") << font.pointSize();         });     ui.setupUi(this); }
  原文链接:「链接」
  资料领取:Qt资料领取(视频教程+文档+代码+项目实战)

马卡本泽马在金球典礼所戴手表价值50万欧,莱万的仅60欧直播吧10月19日讯本泽马赢得今年金球奖莱万夺得穆勒奖,马卡报则对比了两人在典礼上所戴手表情况。该媒体介绍称,本泽马所戴的是RM6501型号手表,该款型号是RichardMille10厘米的尖头细跟鞋,豹纹的款式设计,搭配黑色紧身牛仔裤转眼间到了深秋时节,天气也有点冷了,不少人会多穿一些服装,让自己更加暖和一些,依旧有不少人想要搭配出精致的感觉,所以选择的服装,也会很好看,她们会注意款式和颜色的搭配,秋天的搭配,精致宅居家好物分享疫情期间很多人因为各种原因无法出行,宅在家里会无聊,这个时候怎么能不做精致girl呢?让我们一起放松心情的同时还能精致护肤,迎接新的挑战。居家怎么能少得了面膜,眼罩和美容仪??这三今冬流行的11款外套,叠穿显瘦又好看万物皆美好的秋冬季节,把心仪好物穿起来,开启浪漫的冬日之旅女人最好的姿态是,每天化个淡妆穿上喜欢的衣裳,不羡慕谁不依赖谁,静悄悄地努力活成自己想要的模样图0冬季氛围感01白色中长款梁靖崑有多刺头?染发私生活混乱,赢樊振东踩桌子,球拍塞裤子国乒的球员一般都很受球迷们喜欢,除了战绩不俗之外,球员们的性格赛场上的飒爽英姿往往都被引发外界的关注,尤其是国乒的主力球员,即便是樊振东等人都从不玩社交媒体,依旧有大量的拥趸。要说鲁粤对决,山东胜广东,杜锋为固执买单,轻视陶汉林酿败局CBA联赛第四轮最后一场比赛,山东高速主场迎战广东宏远,如果单纯从历史传承看,山东男篮应该也算是CBA历史强队,但是如果看鲁粤双方的对阵历史,山东队13胜60败的战绩的确有点辣眼睛鲁粤对决,山东胜广东,杜锋为固执买单,轻视陶汉林酿败局CBA联赛第四轮最后一场比赛,山东高速主场迎战广东宏远,如果单纯从历史传承看,山东男篮应该也算是CBA历史强队,但是如果看鲁粤双方的对阵历史,山东队13胜60败的战绩的确有点辣眼睛CBA最新消息!上海男篮裁掉比斯利,易建联受伤,张镇麟复出当上海男篮签下比斯利的时候,都认为这位所谓的超级外援能够带领球队去冲击总冠军,结果四场比赛过后,比斯利已经成为上海男篮最大的毒瘤。据了解上海男篮方面已经决定裁掉比斯利,窗口期的时候CBA最新消息!上海男篮裁掉比斯利,易建联受伤,张镇麟复出当上海男篮签下比斯利的时候,都认为这位所谓的超级外援能够带领球队去冲击总冠军,结果四场比赛过后,比斯利已经成为上海男篮最大的毒瘤。据了解上海男篮方面已经决定裁掉比斯利,窗口期的时候离队失败,带队也失败!没有阿联周鹏兜底,赵睿你真是寸步难行出战37分钟,14次出手命中3球,全场仅得到12分4篮板4助攻,这就是宏远当家后卫赵睿在球队生死战中打出来的表现。在周鹏转会易建联处于半退役状态下,赵睿已经成为了广东宏远明面上实际离队失败,带队也失败!没有阿联周鹏兜底,赵睿你真是寸步难行出战37分钟,14次出手命中3球,全场仅得到12分4篮板4助攻,这就是宏远当家后卫赵睿在球队生死战中打出来的表现。在周鹏转会易建联处于半退役状态下,赵睿已经成为了广东宏远明面上实际
8款高质量的实用App,让你的手机好用数倍不止已经很久没有给大家分享内容了,今天我们就从手机App开始吧!最近我发现8款高质量的实用App,能让你的手机更好用。01ONE一个推荐理由简约的新媒体阅读平台。生活中往往有太多的碎片ToB企业品牌有什么作用?本文由36氪企服点评专家团陈小步原创。陈小步TOB品牌营销策略与实战,公众号同名正文TOB市场人经常遇到老板的问题要做品牌吗?品牌有用吗?这个问题很难回答,有的ToB企业广铺销售,致命的拍摄印度自拍死亡率全球第一印度人酷爱自拍,随着移动互联网社交平台的兴起,他们很喜欢在社交平台上秀自拍照,可以说自拍发圈成为许多印度人日常生活重要的一部分,而伴随这一喜好发生的悲喜剧也屡屡上演。近日,美国研究6款你没理由拒绝的黑科技App,每一款都值得推荐在我们的手机中,有许多我们从未见过的APP,这些APP有的可以将手机变得更全能,而有的却只能占用手机内存,今天就来给大家推荐6款不为人知的黑科技APP,让手机更加全能!No。1盒子10月汽车投诉榜国产车一哥吉利登顶,日系车表现刺眼日前,汽车投诉平台车质网,公布了10月份的汽车投诉榜单。与前几月的投诉情况相比,投诉榜前十车型历经了大洗牌,投诉榜第一被国产车一哥吉利汽车拿下,而前五车型中,日系车占据四席。具体来全球十大新材料顶尖巨头一陶氏(美国营业收入2514亿元)2020年净利润79。93亿元美国陶氏是一家全球领先多元化的化学公司,公司将可持续原则贯穿于化学与创新,致力于解决当今世界的诸多挑战,比如满足清洁不承认中国是发展中国家?12月1日起,西方32国取消对华关税优惠特朗普时期,美国政府对中国部分出口商品加征关税,中方随后予以反击,双方打起了贸易战。拜登在参加竞选时,曾表示若当选,将取消对华加征的关税,但如今他上台9个多月了,却仍没有兑现诺言。一切都会过去的!(顿悟)很久以前,有一个国王想找到一句话,它能让高兴的人听了难过,难过的人听了高兴。他找了很长时间都没有找到。直到有一天夜里,他梦见智者对他说了一句话,正是自己想找的。这句史上最神奇的话就晚安好梦的句子,睡前发朋友圈的短句一人世情感多为无常。身边太多人的离开都让我猝不及防,每每还没来得及好好告别,就从此再也不见。总算明白,无情的不是时间,而是人心的善变。晚安二大部分的痛苦,都是不肯离场的结果,没有命越南网友评论中国火星探测器发回首批照片RobotsaoHacaTrungQucginhchputin中国火星探测器发回首批照片TrungQucchiasnhngbcnhrntutindorobotChcDunggivT实践20号遭老美卫星碰瓷,欲贴身磁扰,它到底想干啥?随着航天科学技术的不断发展,各国每年都会发射很多的卫星,据统计截至2020年4月,太空中在轨运行卫星的数量共有2666颗,这一数字一直在增加着,这些卫星根据其不同的作用可以分为通讯