转自豆子空间

主窗口##

Qt的GUI程序有一个常用的顶层窗口,叫做MainWindow。MainWindow继承自QMainWindow。QMainWindow窗口分成几个主要的区域:



最上面是Window Title,用于显示标题和控制按钮,比如最大化、最小化和关闭等;下面一些是Menu Bar,用于显示菜单;再下面一点事Toolbar areas,用于显示工具条,注意,Qt的主窗口支持多个工具条显示,因此这里是ares,你可以把几个工具条并排显示在这里,就像Word2003一样;工具条下面是Dock window areas,这是停靠窗口的显示区域,所谓停靠窗口就是像Photoshop的工具箱一样,可以在主窗口的四周显示;再向下是Status Bar,就是状态栏;中间最大的Central widget就是主要的工作区了。

菜单和工具条##

QMainWindow的基础之上添加菜单和工具条。

Qt里面有一个类,叫做QAction。顾名思义,QAction类保存有关于这个动作,也就是action的信息,比如它的文本描述、图标、快捷键、回调函数(也就是信号槽),等等。神奇的是,QAction能够根据添加的位置来改变自己的样子——如果添加到菜单中,就会显示成一个菜单项;如果添加到工具条,就会显示成一个按钮。

添加一个打开命令。那么,就在头文件里面添加一个私有的QAction变量:

class QAction;
//...
private:
QAction *openAction;
//...

注意,不要忘记QAction类的前向声明哦!要不就会报错的!

然后我们要在cpp文件中添加QAction的定义。为了简单起见,我们直接把它定义在构造函数里面:

       openAction = new QAction(tr("&Open"), this);
openAction->setShortcut(QKeySequence::Open);
openAction->setStatusTip(tr("Open a file."));

第一行代码创建一个QAction对象。QAction有几个重载的构造函数,我们使用的是

QAction(const QString &text, QObject* parent);

这一个。它有两个参数,第一个text是这个动作的文本描述,用来显示文本信息,比如在菜单中的文本;第二个是parent,一般而言,我们通常传入this指针就可以了。我们不需要去关心这个parent参数具体是什么,它的作用是指明这个QAction的父组件,当这个父组件被销毁时,比如delete或者由系统自动销毁,与其相关联的这个QAction也会自动被销毁。

第二句,我们使用了setShortcut函数。shortcut是这个动作的快捷键。Qt的QKeySequence已经为我们定义了很多内置的快捷键,比如我们使用的Open。你可以通过查阅API文档获得所有的快捷键列表,或者是在QtCreator中输入::后会有系统的自动补全功能显示出来。这个与我们自己定义的有什么区别呢?简单来说,我们完全可以自己定义一个tr("Ctrl+O")来实现快捷键。原因在于,这是Qt跨平台性的体现。比如PC键盘和Mac键盘是不一样的,一些键在PC键盘上有,而Max键盘上可能并不存在,或者反之,所以,推荐使用QKeySequence类来添加快捷键,这样,它会根据平台的不同来定义不同的快捷键。

第三句是setStatusTip函数。这是添加状态栏的提示语句。状态栏就是主窗口最下面的一条。现在我们的程序还没有添加状态栏,因此你是看不到有什么作用的。

下面要做的是把这个QAction添加到菜单和工具条:

        QMenu *file = menuBar()->addMenu(tr("&File"));
file->addAction(openAction); QToolBar *toolBar = addToolBar(tr("&File"));
toolBar->addAction(openAction);

QMainWindow有一个menuBar()函数,会返回菜单栏,也就是最上面的那一条。如果不存在会自动创建,如果已经存在就返回那个菜单栏的指针。直接使用返回值添加一个菜单,也就是addMenu,参数是一个QString,也就是显示的菜单名字。然后使用这个QMenu指针添加这个QAction。类似的,使用addToolBar函数的返回值添加了一个工具条,并且把这个QAction添加到了上面。

好了,主要的代码已经写完了。不过,如果你只修改这些的话,是编译不过的哦!因为像menuBar()函数返回一个QMenuBar指针,但是你并没有include它的头文件哦!虽然没有明着写出QMenuBar这个类,但是实际上你已经用到了它的addMenu函数了,所以还是要注意的!

添加图标##

回到mainwindow.cpp,在构造函数中填入代码:

openAction->setIcon(QIcon("../resource/open-file.png"));

使用setIcon添加图标。

效果##



linux_mint

代码##

//main.cpp
#include <qapplication.h>
#include "mainwindow.h" int main( int argc, char **argv )
{
QApplication a( argc, argv ); MainWindow w;
w.show(); return a.exec();
}
//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow> class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow(); private:
QAction *openAction;
}; #endif // MAINWINDOW_H
//mainwindow.cpp
#include <QtGui/QAction>
#include <QtGui/QMenu>
#include <QtGui/QMenuBar>
#include <QtGui/QKeySequence>
#include <QtGui/QToolBar>
#include <QMessageBox>
#include "mainwindow.h" MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
openAction = new QAction(tr("&Open"), this);
openAction->setShortcut(QKeySequence::Open);
openAction->setStatusTip(tr("Open a file."));
openAction->setIcon(QIcon("../resource/open-file.png"));
connect(openAction, SIGNAL(triggered()), this, SLOT(open())); QMenu *file = menuBar()->addMenu(tr("&File"));
file->addAction(openAction); QToolBar *toolBar = addToolBar(tr("&File"));
toolBar->addAction(openAction);
} void MainWindow::open()
{
QMessageBox::information(NULL, tr("Open"), tr("Open a file"));
} MainWindow::~MainWindow()
{ }

Qt__主窗口、菜单和工具条(QMainWindow,QMenu,QToolBar)的更多相关文章

  1. 雷林鹏分享:jQuery EasyUI 窗口 - 自定义带有工具条和按钮的对话框

    jQuery EasyUI 窗口 - 自定义带有工具条和按钮的对话框 您可以创建一个带有工具栏(toolbar)和按钮(button)的对话框(dialog),可以从 HTML 标记创建.这个教程描述 ...

  2. QT学习之路--菜单、工具条、状态栏

    下面一些是 Menu Bar,用于显示菜单;再下面一点事 Toolbar areas,用于显示工具条,Status Bar,就是状态栏. Qt 提供了一个 QStatusBar 类来实现状态栏. Qt ...

  3. 如何往IE工具条添加按钮(转载)

    如何往IE工具条添加按钮 问题提出:金山词霸.网络蚂蚁等软件安装后会向IE的工具条添加自己的按钮.按下按钮后还会作出相应的动作,这种功能是如何实现的呢?读完本文,您也可以将自己应用程序的按钮添加到IE ...

  4. 如何获得 Qt窗口部件在主窗口中的位置--确定鼠标是否在某一控件上与在控件上的位置

    用Qt Creator 设计程序时,最方便的就是ui设计器,可以很容易的得到想要的布局. 但是这样自动布局带来的后果是很难知道窗口中某一部件在主窗口中的相对位置. 在处理子窗口鼠标事件时变的很麻烦.主 ...

  5. 黄聪:自定义WordPress前台、后台顶部菜单栏管理工具条的技巧

    使用WordPress开发网站项目,很多时候都需要对进行后台定制,今天倡萌主要分享下自定义顶部管理工具条的使用技巧. 注:如无特殊说明,请将下面的代码添加到主题的 functions.php  或者插 ...

  6. 黄聪:自定义WordPress顶部管理工具条的技巧(转)

    使用WordPress开发网站项目,很多时候都需要对进行后台定制,今天倡萌主要分享下自定义顶部管理工具条的使用技巧. 注:如无特殊说明,请将下面的代码添加到主题的 functions.php  或者插 ...

  7. CAD隐藏或显示工具条上的按钮(com接口VB语言)

    主要用到函数说明: MxDrawXCustomFunction::Mx_HideToolBarControl 隐藏或显示工具条上的按钮.详细说明如下: 参数 说明 IN LPCTSTR pszTool ...

  8. 主窗口QMainWindow和启动画面

    在较为大型复杂,功能较多的应用程序中,我们通常继承QMainWindow类来进行开发.该主窗口为搭建应用用户界面提供了非常好的框架,请看下图: 可以看出该主窗口类为我们提供了菜单栏(Menu Bar) ...

  9. PyQt(Python+Qt)学习随笔:QMainWindow的addDockWidget方法增加QDockWidget停靠窗到主窗口

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 DockWidget除了放在QMainWindow窗口内外,也可以放在 ...

随机推荐

  1. MetaMask/sw-controller

    https://github.com/MetaMask/sw-controller Service Worker Controller Used to register a service worke ...

  2. ECS API

    一.API调用方式 ➢对ECS API接口调用是通过向ECS API的服务端地址发送HTTP GET请求,并按照接口说明在请求 中加入相应请求参数来完成的;根据请求的处理情况,系统会返回处理结果. ➢ ...

  3. java 实现serialVersionUID

    文章转自  https://www.cnblogs.com/duanxz/p/3511695.html 作用 serialVersionUID适用于Java的序列化机制.简单来说,Java的序列化机制 ...

  4. [转]matplotlib - plt.rcParams、matshow/cmap/坐标轴设置

    转自:https://blog.csdn.net/qq_30815237/article/details/87903024 1.plt.rcParams plt(matplotlib.pyplot)使 ...

  5. VS2017 安装visualSVN 6.1.1 for visual studio 2017

    1.官网下载地址:https://www.visualsvn.com/visualsvn/download/ 2.安装

  6. android 3.0+百度地图api地图如何移动到指定的经纬度处

    由于百度地图api,2.0+和3.0+的改动比较大,api基本上被全换过了,有些同学可能2.0+的api使用的非常熟悉,但是更新到3.0+时,却会遇到一些小麻烦(由于api变了,你就需要重新学习它的a ...

  7. 车轮升级PHP7踩过的一些坑

    社区php7升级记录 社区服务器已经全部完成升级,这里记录一下社区升级php7所遇到的问题,可以分为四个类型 扩展支持的变化,导致需要修改配置甚至调整替换操作的类库 php7语法检查比之前变得严格,部 ...

  8. Intellij实用技巧

    快捷键 Tradition 快捷键 介绍 Ctrl + Z 撤销 Ctrl + Shift + Z 取消撤销 Ctrl + X 剪切 Ctrl + C 复制 Ctrl + S 保存 Tab 缩进 Sh ...

  9. JQuery加载html网页

    在ASP.NET MVC环境中,使用jQuery脚本去实现加载html网页. 一般情况之下,在ASP.NET MVC项目中,你不能在~/Views目录之下添加或是创建任何html为后缀的网页.但这也不 ...

  10. windows平台快速搭建Linux(CentOS)

    VMware简介 VMware Workstation(简称 “虚拟机”)是一款功能强大的桌面虚拟计算机软件,用户可在Windows平台通过VMware软件同时运行不同的操作系统.这对IT开发人员而言 ...