Qt中的主窗口QMainWindow
来源:互联网 发布:bm相似度算法 编辑:程序博客网 时间:2024/05/17 23:18
GUI应用程序都有一个主窗口,虽然前面讲到的QWidget组件也可以定义生成主窗口,但是Qt还定义了一个专门用于实现主窗口的类QMainWindow。为什么?跟QDialog一样的道理,主窗口具有许多主窗口特有的元素组件,为了程序的复用性,Qt在QWidget的基础上“特例化”了一个QMainWindow。
GUI程序是由一个主窗口和多个对话框组成,主窗口是与用户进行长时间交互的窗口,是程序启动后显示的第一个窗口,程序的绝大多数功能是直接由主窗口提供,辅助功能由对话框提供。
QMainWindow是Qt中主窗口的基类:
显然,QMainWindow是一种容器类型的组件。
QMainWindow封装了主窗口常用的菜单栏组件、工具栏组件、中心组件组件、停靠栏组件和状态栏组件。对于程序员来讲对这些概念再熟悉不过了。Qt是面向对象的GUI开发平台,所以上述封装在MainWindow中的组件自然也是以类的形式存在:
1. 菜单栏组件QMenuBar1.1 下拉菜单项组QMenu1.2 菜单项QAction2. 工具栏组件QToolBar2.1 快捷项QAction3. 状态栏组件QStatusBar3.1 任意组件QWidget
1. 菜单栏组件
新建基类为QMainWindow的Qt Gui应用程序:
//main.cpp#include <QtGui/QApplication>#include "MainWindow.h"int main(int argc, char *argv[]){ QApplication a(argc, argv); MainWindow w; w.show(); return a.exec();}//MianWindow.h#include <QtGui/QMainWindow>#include <QKeySequence>#include <QMenuBar>#include <QMenu>#include <QAction>class MainWindow : public QMainWindow{ Q_OBJECTprivate: //初始化菜单栏 void InitMenuBar();public: MainWindow(QWidget *parent = 0); ~MainWindow();};//MainWindow.cpp#include "MainWindow.h"MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){ setWindowTitle("main_window"); InitMenuBar();}MainWindow::~MainWindow(){}void MainWindow::InitMenuBar(){ //从主窗口组件中获取菜单栏组件 QMenuBar *menu_bar = this->menuBar(); //定义菜单项组,显示名称为"File(F)","(&F)"用于快捷键 QMenu *menu = new QMenu("File(&F)", this); //定义open菜单项,"Open(O)"为菜单项名称 QAction *action_open = new QAction("Open(O)", this); //为菜单项定义快捷键,QKeySequence是Qt中与快捷键相关的类 action_open->setShortcut(QKeySequence(Qt::Key_O)); QAction *action_new = new QAction("New(N)", this); action_new->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_N)); QAction *action_save = new QAction("Save(S)", this); action_save->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_S)); //将菜单项加入菜单项组 menu->addAction(action_open); menu->addAction(action_new); menu->addAction(action_save); //将菜单项组加入菜单栏 menu_bar->addMenu(menu);}
编译运行:
2. 工具栏组件
工具栏是主窗口继承各种各种功能的实现快捷使用的区域,它并不是Gui程序中必须存在的组件。工具栏中的元素一般是以图标按钮的方式存在。
#include <QToolBar>#include <QIcon>void MainWindow::InitToolBar(){ //为主窗口添加工具栏 QToolBar* tool_bar = this->addToolBar("tool bar"); //定义工具栏项,工具栏项不需要名称 QAction* action = new QAction("", this); //设置工具栏不可浮动,默认是可浮动的 tool_bar->setFloatable(false); //设置工具栏不可移动,默认是可以移动的 tool_bar->setMovable(false); //设置工具栏项的提示文字,即鼠标停在该元素时显示 action->setToolTip("Open"); //设置工具栏项图标 action->setIcon(QIcon(":/pic/open.png")); //将工具栏项添加至工具栏 tool_bar->addAction(action);}
open.png是工具栏元素中的图标,需要在Qt Create中添加资源文件:
(1) 创建xxx.qrc资源文件
右键项目 -> 添加新文件,选择Qt,资源文件 -> 点击浏览,选择存放图标文件的目录,键入名称xxx -> 添加前缀、添加图标文件
(2) 添加资源文件
右键项目 -> 添加现有文件 -> 选择刚才目录下的xxx.qrc
这样就将资源文件添加到Qt Qreate了。需要注意,代码中对图片文件的引用,其前缀和文件名称需要与资源文件中的对应。
运行:
工具栏项除了可以是图标文件,还可以是其他各种其他Widget窗口元素:
void MainWindow::InitToolBar(){ //... QPushButton *btn = new QPushButton("1"); QLabel* label = new QLabel("hello"); QLineEdit *line_edit = new QLineEdit(); tool_bar->addAction(action); //将其它窗口组件加入工具栏 tool_bar->addWidget(btn); tool_bar->addWidget(label); tool_bar->addWidget(line_edit);}
编译运行:
3. 状态栏组件
状态栏一般位于主窗口的底部,是GUI程序中输出简要信息的区域:如表示当前程序状态的实时消息,表示程序版本号的永久消息,表示百分比/进度条提示的进度消息。
Gui程序中状态栏的设计原则一般为左边区域用于输出实时消息,右边区域用于设置永久消息。在Qt中,将Widget添加到状态栏用addWidget()函数是添加到左半部分,addPermanenWinget()是添加到右半部分。
void MainWindow::InitStatusBar(){ //获取主窗口中的状态栏 QStatusBar* status_bar = statusBar(); //定义标签栏 QLabel *lable = new QLabel("lable", this); //定义按钮 QPushButton* btn = new QPushButton("Button", this); //将标签添加到状态栏的右边 status_bar->addPermanentWidget(lable); //status_bar->addWidget(btn); //设置状态栏的提示信息,显示在左边 status_bar->showMessage("HelloWorld");}
运行:
- Qt中的主窗口QMainWindow
- QT主窗口QMainWindow
- Qt的主窗口QMainWindow
- Qt实现基本QMainWindow主窗口程序
- Qt实现基本QMainWindow主窗口程序
- Qt实现基本QMainWindow主窗口程序
- Qt实现基本QMainWindow主窗口程序
- QT开发(二十二)——QMainWindow主窗口
- Qt窗口之QMainWindow、QDialog、QWidget
- Qt窗口之QMainWindow、QDialog、QWidget
- Qt-QMainWindow
- 基于QMainWindow的主窗口程序例子
- QT-QMainWindow布局设置
- 初学Qt(QMainWindow入门)
- Qt:自定义标题栏(QMainWindow)
- Qt中三个窗口基类(QMainWindow , QWidget , QDialoh)的区别
- QT初级错误:继承于QMainwindow的窗口需调用setCentralWidget
- QT基础——解决QTabWidget控件铺满QMainWindow父窗口
- sockshadow 安装
- codeforces819bMister B and PR Shifts
- io复用的几个系统调用
- 深入理解Java虚拟机——JVM、DVM(dalvik)和ART之间的区别
- DOM文档对象模型
- Qt中的主窗口QMainWindow
- HDFS定时上传日志的Shell案列
- poj3295(构造法?)
- 在MVC中引用EasyUI
- 51Nod 1010 只包含因子2 3 5的数
- Linux学习(十二):gcc编译和gdb调试
- UVA 361 Cops and Robbers(凸包应用)
- PascalTriangle
- Android修改屏幕密度