信誉好的天津网站建设,大学科技园东区 做网站,企业做网站的方案,企点营销软件文章目录 QMainWindow菜单栏工具栏状态栏浮动窗口对话框自定义对话框Qt内置对话框QMessageBox QMainWindow
Qt中的主窗口以QMainWindow表示#xff0c;其总体结构如下#xff1a; 菜单栏
菜单栏MenuBar#xff0c;可包含多个菜单Menu#xff0c;每个菜单也可以包含多个菜… 文章目录 QMainWindow菜单栏工具栏状态栏浮动窗口对话框自定义对话框Qt内置对话框QMessageBox QMainWindow
Qt中的主窗口以QMainWindow表示其总体结构如下 菜单栏
菜单栏MenuBar可包含多个菜单Menu每个菜单也可以包含多个菜单项Action以QtCreator的菜单栏为例。 Qt中QMenuBar表示菜单栏QMenu表示菜单QAction表示菜单项。
核心接口
接口说明void QMainWindow::setMenuBar(QMenuBar *menuBar)为主窗口设置菜单栏addMenu(QMenu *menu)为菜单栏添加菜单或在菜单中嵌套添加子菜单QWidget::addAction(QAction *action) QMenu::addAction(const QString text)添加菜单项可以使用QAction添加也可直接以文本添加
先上代码。
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui-setupUi(this);//1.创建一个菜单栏并将其设置到窗口MainWindow中QMenuBar* menuBar this-menuBar();this-setMenuBar(menuBar);//2.为菜单栏创建菜单QMenu* menu1 new QMenu(文件 (F));QMenu* menu2 new QMenu(编辑 (E));QMenu* menu3 new QMenu(帮助 (H));//3.将菜单加入菜单栏中menuBar-addMenu(menu1);menuBar-addMenu(menu2);menuBar-addMenu(menu3);//(嵌套子菜单)QMenu* menu31 new QMenu(目录);menu3-addMenu(menu31);menu31-addAction(h1);//直接使用字符串也可以添加菜单项menu31-addAction(h2);menu31-addAction(h3);//4.为菜单创建一些菜单项ActionQAction* action1 new QAction(新建 (N));QAction* action2 new QAction(打开 (O));QAction* action3 new QAction(另存为 (S));menu1-addAction(action1);menu1-addSeparator();//在菜单项之间增加分隔线menu1-addAction(action2);menu1-addSeparator();menu1-addAction(action3);//(为菜单项设置图标)action1-setIcon(QIcon(:/create.png));action2-setIcon(QIcon(:/open.png));action3-setIcon(QIcon(:/save.png));//5.为Aciton的触发绑定槽函数connect(action1, QAction::triggered, this, MainWindow::handle1);connect(action2, QAction::triggered, this, MainWindow::handle2);connect(action3, QAction::triggered, this, MainWindow::handle3);//6.为菜单栏添加一个用于关闭窗口的ActionQAction* action new QAction(关闭 (C));menuBar-addAction(action);connect(action, QAction::triggered, this, MainWindow::close);
}创建菜单栏时可以使用以下两种方式 //1.
QMenuBar* menuBar new QMenuBar();
this-setMenuBar(menuBar);
//2.
QMenuBar* menuBar this-menuBar();
this-setMenuBar(menuBar);第一种方法是直接创建QMenuBar对象然后通过setMenuBar()设置菜单栏这种方法可能会导致内存泄露因为有时候菜单栏是已经存在的比如ui文件会自动生成菜单栏此时如果手动创建一个并set为菜单栏就会覆盖原先的菜单栏导致其内存泄漏。 正确的方法是调用QMainWindow的接口menuBar()其功能若菜单栏已存在则返回已存在的菜单栏若不存在则创建一个新的菜单栏再返回。 创建菜单时需要为菜单设置一个文本title而你可以在title中使用指定该菜单的快捷键如QMenu* menu1 new QMenu(文件 (F))则F为该菜单的快捷键ALT F触发该菜单。同理创建QAction菜单项时也可用同样的方法设置菜单项的快捷键。 菜单可以嵌套即为QMenu添加另外一个QMenu addSeparator()在菜单项之间添加分隔线优化界面。还可以为菜单项添加图标icon。 菜单模块中最后与用户交互的是QAction。用户点击某个菜单项触发QAction的triggered信号通过信号槽机制定义处理方法。需要注意的是不仅菜单栏可以添加QAction菜单也可以添加QActionQAction抽象出公共的用户交互动作。
最终效果 工具栏
⼯具栏是应用程序中集成各种功能实现快捷使⽤的⼀个区域。可有可无不是程序中必须存在的部件。在Qt中QToolBar表示工具栏是一个可移动的组件QAction表示工具栏中的快捷项。一个窗口可以有多个工具栏。
先上代码。
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui-setupUi(this);//1.创建工具栏QToolBar* toolBar new QToolBar();this-addToolBar(toolBar);//一个窗口可以有多个工具栏, 因此使用add而非set//2.添加快捷项QAction* action1 new QAction(保存);QAction* action2 new QAction(打开);toolBar-addAction(action1);toolBar-addAction(action2);//设置快捷项图标action1-setIcon(QIcon(:/save.png));action2-setIcon(QIcon(:/open.png));//设置快捷项的提示信息action1-setToolTip(点击此处保存文件);action2-setToolTip(点击此处打开文件);//绑定触发快捷项的槽函数connect(action1, QAction::triggered, this, [](){qDebug() 保存成功;});connect(action2, QAction::triggered, this, [](){qDebug() 打开成功;});
}关于工具栏的停靠位置可以在添加QToolBar对象时指定停靠位置由枚举类型Qt::ToolBarArea提供有四种.
enum ToolBarArea {LeftToolBarArea 0x1,//左RightToolBarArea 0x2,//右TopToolBarArea 0x4,//上BottomToolBarArea 0x8//下
};//为窗口添加工具栏时指定工具栏的初始停靠位置
QToolBar* toolBar new QToolBar();
this-addToolBar(Qt::LeftToolBarArea, toolBar);后续可以通过代码决定工具栏允许停靠的位置、是否允许浮动、是否允许移动。
//3.工具栏的位置
toolBar-setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);//设置允许停靠的位置
toolBar-setFloatable(false);//设置是否可以浮动 (默认为true)
toolBar-setMovable(true);//设置是否可以移动 (默认为true)同一个QAction可以为菜单项和工具栏中的快捷项共享快捷项成为菜单项的快捷方式。在上述代码作出以下修改。 //创建菜单栏
QMenuBar* menuBar this-menuBar();
this-setMenuBar(menuBar);
QMenu* menu new QMenu(文件);
menuBar-addMenu(menu);
//...
//添加action1菜单项action1已添加为工具栏的快捷项
menu-addAction(action1);状态栏
状态栏是应⽤程序中输出简要信息的区域。⼀般位于主窗口的最底部⼀个窗口中最多只能有⼀个状态栏。在Qt中状态栏是通过QStatusBar类来实现的。在状态栏中可以显示的消息类型有
• 实时消息如当前程序状态 • 永久消息如程序版本号机构名称 • 进度消息如进度条提示
我们可以调用状态栏的showMessage()函数输出一些简单的临时信息也可以在状态栏中添加一些控件widget以显示特定的信息。
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui-setupUi(this);//1.创建状态栏QStatusBar* statusBar this-statusBar();//存在则直接获取不存在则先创建this-setStatusBar(statusBar);//2.显示信息statusBar-showMessage(This is statusBar!!);//也可以为显示信息添加timeout超时时间单位为ms
}为状态栏添加一些控件
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui-setupUi(this);//1.创建状态栏QStatusBar* statusBar this-statusBar();//存在则直接获取不存在则先创建this-setStatusBar(statusBar);//2.创建控件QLabel* label new QLabel(This is a statusBar!!);QProgressBar* progressBar new QProgressBar();progressBar-setValue(50);//3.添加控件到状态栏中可以为控件设置拉伸系数statusBar-addWidget(label, 1);//从左往右添加statusBar-addPermanentWidget(progressBar, 2);//从右往左添加
}浮动窗口
在Qt中浮动窗口也称之为铆接部件一般作为主窗口内部的子窗口。浮动窗口是通过QDockWidget类来实现浮动的功能。浮动窗口⼀般是位于核心部件的周围可以有多个。
注意Qt中规定QDockWidget中只能有一个QWidget因此若需要在浮动窗口中实现更多效果需要先创建一个QWidget对QWidget进行创造再将其设置到浮动窗口QDockWidget中。
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui-setupUi(this);//1.创建浮动窗口QDockWidget* dockWidget new QDockWidget();this-addDockWidget(Qt::LeftDockWidgetArea, dockWidget);//注意添加浮动窗口时须指定其停靠位置(上下左右)//2.为浮动窗口设置一个QWidgetQWidget* widget new QWidget();dockWidget-setWidget(widget);//3.在widget中添加一些控件QVBoxLayout* layout new QVBoxLayout();widget-setLayout(layout);QLabel* label new QLabel(This is a dockWidget!!);QPushButton* btn1 new QPushButton(按钮1);QPushButton* btn2 new QPushButton(按钮2);layout-addWidget(label);layout-addWidget(btn1);layout-addWidget(btn2);//4.设置浮动窗口只能停靠左侧或右侧dockWidget-setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
}对话框
对话框通常是⼀个顶层窗⼝出现在程序最上层⽤于实现短期任务或者简洁的用户交互。Qt的对话框由类QDialog实现。Qt中还提供了一些内置对话框方便特殊场景下的开发Qt常用的内置对话框有QFiledialog⽂件对话框、QColorDialog颜⾊对话框、QFontDialog字体对话框、QInputDialog输⼊对话框和 QMessageBox消息框。
//主窗口设置一个按钮点击按钮弹出对话框
void MainWindow::on_pushButton_clicked()
{//1.创建对话框QDialog* dialog new QDialog(this); dialog-resize(500,300);dialog-setWindowTitle(对话框);//2.显示对话框dialog-show();
}关于对话框的内存泄漏问题 上述创建对话框的过程虽然将对话框的父节点设置为上级主窗口但是防不住用户在主窗口销毁之前打开的对话框过多、或对话框占用内存过大导致内存泄漏。我们想要达成的效果是用户关闭一个对话框点击对话框左上角的❌时就将该对话框delete。Qt中为对话框QDialog内置了一些属性设置WA_DeleteOnClose属性表示对话框关闭时释放内存。 dialog-setAttribute(Qt::WA_DeleteOnClose);对话框有两种类型模态(modal) 和 非模态。 模态对话框显示后无法与父窗口进行交互是⼀种阻塞式的对话框。使用QDialog::exec()函数调用。模态对话框适用于一些必须让用户作出选择的场景如文件选择、打印设置等。 非模态对话框显示后依然可以与父窗口进行交互是一种非阻塞式的对话框。使用QDialog::show()函数调用。
自定义对话框
Qt提供对话框基类QDialog开发者如果需要自定义一个对话框就需要以QDialog为父类创建一个派生类在派生类中自定义一些控件、GUI效果等。具体做法可以通过QtCreator内的文件菜单创建一个继承自QDialog的派生类并在自动生成的头文件和源文件中自定义派生类。
//这里创建了一个Dialog类继承自QDialog
//在其构造函数中添加一些控件
Dialog::Dialog(QWidget* parent) : QDialog(parent)
{QVBoxLayout* layout new QVBoxLayout();this-setLayout(layout);QLabel* label new QLabel(This is a Dialog!!);QPushButton* btn new QPushButton(按钮);layout-addWidget(label);layout-addWidget(btn);
}通过创建对话框的ui文件进行图形化的自定义。
Qt内置对话框
QMessageBox
QMessageBOX是消息对话框主要用于为用户提示主要的信息或是让用户进行选择操作。
一个消息对话框中的内容主要包括标题、提示信息、消息类型图标和按钮。
先上代码。
void MainWindow::on_pushButton_clicked()
{QMessageBox* msgBox new QMessageBox(this);msgBox-setWindowTitle(消息对话框);//设置标题msgBox-setText(Warning);//设置提示信息msgBox-setIcon(QMessageBox::Warning);//设置消息的类型msgBox-setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);//设置标准按钮// 也可以调用addButton为消息对话框添加自定义按钮但是一般用标准按钮就足够了// msgBox-addButton()
}消息类型
enum Icon {NoIcon 0,Information 1,Warning 2,Critical 3,Question 4
};类型适用场景Question用于正常操作过程中的提问Information用于提示正常运行的消息Warning用于提示非关键的错误警告Critical用于提示严重错误
事实上QMessageBox提供了一系列静态函数用于创建一个消息对话框一个函数涵盖了设置标题、文本、消息类型和按钮等功能。如下四个不同的静态函数表示创建四种不同类型的消息对话框。 void MainWindow::on_pushButton_clicked()
{QMessageBox::warning(this,消息对话框,Do you want to do something?, QMessageBox::Ok | QMessageBox::No);
}使用静态函数生成的对话框是模态类型的。 如何获取用户与消息对话框交互的结果 对于模态类型的消息对话框其exec()返回值就是用户选择的结果返回的是选择的StandardButton的值。Qt::StandardButton是一个枚举类型每一种按钮对应一个特定值。而critical information, warning, question四个静态函数的返回值是QMessageBox::StandardButton就是返回用户点击的按钮。 我们可以根据这个返回值对用户不同的选中作出不同的处理。 void MainWindow::on_pushButton_clicked()
{int ret QMessageBox::warning(this,消息对话框,Do you want to do something?, QMessageBox::Ok | QMessageBox::No);if(ret QMessageBox::Ok){qDebug() Ok, lets do it;}else if(ret QMessageBox::No){qDebug() Alright, Bye;}
} 文章转载自: http://www.morning.bktzr.cn.gov.cn.bktzr.cn http://www.morning.tkkjl.cn.gov.cn.tkkjl.cn http://www.morning.ftsmg.com.gov.cn.ftsmg.com http://www.morning.dxgt.cn.gov.cn.dxgt.cn http://www.morning.ybnps.cn.gov.cn.ybnps.cn http://www.morning.fgppj.cn.gov.cn.fgppj.cn http://www.morning.lbjdx.cn.gov.cn.lbjdx.cn http://www.morning.mtzyr.cn.gov.cn.mtzyr.cn http://www.morning.kwqt.cn.gov.cn.kwqt.cn http://www.morning.qlry.cn.gov.cn.qlry.cn http://www.morning.lgznc.cn.gov.cn.lgznc.cn http://www.morning.dpqwq.cn.gov.cn.dpqwq.cn http://www.morning.mqmmc.cn.gov.cn.mqmmc.cn http://www.morning.jhxdj.cn.gov.cn.jhxdj.cn http://www.morning.rbbgh.cn.gov.cn.rbbgh.cn http://www.morning.qkzdc.cn.gov.cn.qkzdc.cn http://www.morning.fkgcd.cn.gov.cn.fkgcd.cn http://www.morning.bpwdc.cn.gov.cn.bpwdc.cn http://www.morning.fslxc.cn.gov.cn.fslxc.cn http://www.morning.brzlp.cn.gov.cn.brzlp.cn http://www.morning.gqwbl.cn.gov.cn.gqwbl.cn http://www.morning.bmhc.cn.gov.cn.bmhc.cn http://www.morning.xkwrb.cn.gov.cn.xkwrb.cn http://www.morning.tjwfk.cn.gov.cn.tjwfk.cn http://www.morning.yyngs.cn.gov.cn.yyngs.cn http://www.morning.hsrpc.cn.gov.cn.hsrpc.cn http://www.morning.wgkz.cn.gov.cn.wgkz.cn http://www.morning.ljcjc.cn.gov.cn.ljcjc.cn http://www.morning.xhwty.cn.gov.cn.xhwty.cn http://www.morning.dbrdg.cn.gov.cn.dbrdg.cn http://www.morning.lkjzz.cn.gov.cn.lkjzz.cn http://www.morning.fthcn.cn.gov.cn.fthcn.cn http://www.morning.lbrwm.cn.gov.cn.lbrwm.cn http://www.morning.chkfp.cn.gov.cn.chkfp.cn http://www.morning.mgwdp.cn.gov.cn.mgwdp.cn http://www.morning.nmkfy.cn.gov.cn.nmkfy.cn http://www.morning.touziyou.cn.gov.cn.touziyou.cn http://www.morning.ybnzn.cn.gov.cn.ybnzn.cn http://www.morning.tpmnq.cn.gov.cn.tpmnq.cn http://www.morning.zrnph.cn.gov.cn.zrnph.cn http://www.morning.wdlg.cn.gov.cn.wdlg.cn http://www.morning.nrjr.cn.gov.cn.nrjr.cn http://www.morning.pffx.cn.gov.cn.pffx.cn http://www.morning.bgxgq.cn.gov.cn.bgxgq.cn http://www.morning.wcqkp.cn.gov.cn.wcqkp.cn http://www.morning.snktp.cn.gov.cn.snktp.cn http://www.morning.xjbtb.cn.gov.cn.xjbtb.cn http://www.morning.ghryk.cn.gov.cn.ghryk.cn http://www.morning.rqlqd.cn.gov.cn.rqlqd.cn http://www.morning.qxgmp.cn.gov.cn.qxgmp.cn http://www.morning.pjwfs.cn.gov.cn.pjwfs.cn http://www.morning.dfkmz.cn.gov.cn.dfkmz.cn http://www.morning.knczz.cn.gov.cn.knczz.cn http://www.morning.tjkth.cn.gov.cn.tjkth.cn http://www.morning.fwwkr.cn.gov.cn.fwwkr.cn http://www.morning.wschl.cn.gov.cn.wschl.cn http://www.morning.ampingdu.com.gov.cn.ampingdu.com http://www.morning.llxqj.cn.gov.cn.llxqj.cn http://www.morning.kjfsd.cn.gov.cn.kjfsd.cn http://www.morning.pnbls.cn.gov.cn.pnbls.cn http://www.morning.ljsxg.cn.gov.cn.ljsxg.cn http://www.morning.mcmpq.cn.gov.cn.mcmpq.cn http://www.morning.wcczg.cn.gov.cn.wcczg.cn http://www.morning.ckhry.cn.gov.cn.ckhry.cn http://www.morning.bqpg.cn.gov.cn.bqpg.cn http://www.morning.rongxiaoman.com.gov.cn.rongxiaoman.com http://www.morning.bxhch.cn.gov.cn.bxhch.cn http://www.morning.hmsong.com.gov.cn.hmsong.com http://www.morning.wmsgt.cn.gov.cn.wmsgt.cn http://www.morning.zfwjh.cn.gov.cn.zfwjh.cn http://www.morning.mhmsn.cn.gov.cn.mhmsn.cn http://www.morning.gbnsq.cn.gov.cn.gbnsq.cn http://www.morning.pbygt.cn.gov.cn.pbygt.cn http://www.morning.ktsth.cn.gov.cn.ktsth.cn http://www.morning.nslwj.cn.gov.cn.nslwj.cn http://www.morning.wmyqw.com.gov.cn.wmyqw.com http://www.morning.pjwrl.cn.gov.cn.pjwrl.cn http://www.morning.dnvhfh.cn.gov.cn.dnvhfh.cn http://www.morning.rtqyy.cn.gov.cn.rtqyy.cn http://www.morning.smpb.cn.gov.cn.smpb.cn