3.1 继承QMainWindow类(Subclassing QMainWindow)

2023-10-31

3.1 继承QMainWindow

一个应用程序的主窗口要从QMainWindow继承。我们在第二章看到的创建对话框的方法可以用来创建主窗口,QDialogQMainWindow都是继承自QWidget类。

主窗口可用Qt Designer创建。但是在这一章,我们使用c++代码实现。如果你喜欢使用可视化的工具,可以参考在线手册“Creating Main Windows in Qt Designer”。

SpreadSheet应用程序的主窗口类定义文件和实现文件分别在mainwindow.hmainwindow.cpp中,首先看头文件:

#ifndef MAINWINDOW_H

#define MAIhNWINDOW_H

#include <QMainWindow>

class QAction;

class QLabel;

class FindDialog;

class Spreadsheet;

class MainWindow : public QMainWindow

{

    Q_OBJECT

public:

    MainWindow();

protected:

    void closeEvent(QCloseEvent *event);

private slots:

    void newFile();

    void open();

    bool save();

    bool saveAs();

    void find();

    void goToCell();

    void sort();

void about();

void openRecentFile();

void updateStatusBar();

void spreadsheetModified();

private:

void createActions();

    void createMenus();

    void createContextMenu();

    void createToolBars();

    void createStatusBar();

    void readSettings();

    void writeSettings();

    bool okToContinue();

    bool loadFile(const QString &fileName);

    bool saveFile(const QString &fileName);

    void setCurrentFile(const QString &fileName);

    void updateRecentFileActions();

    QString strippedName(const QString &fullFileName);

    Spreadsheet *spreadsheet;

    FindDialog *findDialog;

    QLabel *locationLabel;

    QLabel *formulaLabel;

    QStringList recentFiles;

    QString curFile;

    enum { MaxRecentFiles = 5 };

    QAction *recentFileActions[MaxRecentFiles];

    QAction *separatorAction;

    QMenu *fileMenu;

    QMenu *editMenu;

   

    QToolBar *fileToolBar;

    QToolBar *editToolBar;

    QAction *newAction;

    QAction *openAction;

   

    QAction *aboutQtAction;

};

#endif

 

我们定义MainWindow类继承自QMainWindow。因为它有自己的信号和槽,所以声明了Q_OBJECT宏。

closeEvent()QWidget的虚函数,当用户关闭窗口时自动调用。在MainWindow中它被重新实现,这样我们就可以提出用户一些常见的问题,如:保存所作的改变?,提示用户存盘。

有些菜单项,如File|NewHelp|About等被声明为MainWindow的私有的相应函数。多数的槽函数返回值为void,但是save()saveAs()返回的值为bool型。当一个槽函数由信号引发时它的返回值被忽略,但是如果槽函数做为普通函数调用,这个返回值就可以象其他普通函数一样被得到。

在这个类中还声明了很多其他的私有槽函数和私有函数实现用户界面的功能。除此之外还有很多私有变量,这些在使用的时候会解释。

下面来看源文件代码:

#include <QtGui>

#include "finddialog.h"

#include "gotocelldialog.h"

#include "mainwindow.h"

#include "sortdialog.h"

#include "spreadsheet.h"

MainWindow::MainWindow()

{

    spreadsheet = new Spreadsheet;

    setCentralWidget(spreadsheet);

    createActions();

    createMenus();

    createContextMenu();

    createToolBars();

    createStatusBar();

    readSettings();

    findDialog = 0;

    setWindowIcon(QIcon(":/images/icon.png"));

    setCurrentFile("");

}

在包含文件中由<QtGUI>,这包含了我们在这个类中使用的很多Qt类。其他是第二章中定义的头文件,这里也使用了。

在构造函数中,我们开始创建SpreadSheet控件,并把这个控件做为主窗口的中心控件。这个控件占据主窗口的中间部分。SpreadSheet是一个QTableWidget控件,具有一些简单的列表功能,将会在第四章实现。

然后我们调用createActions()createMenus()createContext-Menu()createToolBars()createStatusBar()创建主窗口的其他部分。readSettings()读取程序保存在磁盘上的一些设置。

我们把findDialog指针为空,当MainWindow::find()第一次被调时,将会创建一个FindDialog对象。

最后,我们设置窗口的图标为icon.pngQt支持多种格式的图片文件,包括BMP, GIF, JPEG, PNG, PNM, XBM, XPM     。在QWidget::setWindowIcon()中设置的图标显示在程序主窗口的左上角。不过,Qt没有提供一个平台无关的程序的桌面图标。相关平台的处理方式可参考http://doc.trolltech.com/4.1/appicon.html.中说明。

GUI程序通常会使用很多图片。提供图片的方式很多,主要有:

1、  把图片存储在文件中,程序运行时加载它们

2、  在源代码中包含XPM文件(这种文件是有效的c++文件)

3、  使用Qt提供的资源管理方案。

这里我们使用Qt提供的资源管理方案,因为它能够发在运行时方便的加载图片文件,并支持以上文件格式。这里假设图片文件保存在应用程序源代码目录的字母里images里面。

使用这个方案时,需要创建一个资源文件,并在.pro文件中添加这个资源文件的有关信息。在这个例子中,定义资源文件为spreadsheet.qrc,在.pro文件中加入如下信息:

RESOURCES     = spreadsheet.qrc

在资源文件中使用了简单的XML格式:

<!DOCTYPE RCC><RCC version="1.0">

<qresource>

    <file>images/icon.png</file>

    ...

    <file>images/gotocell.png</file>

</qresource>

</RCC>

资源文件被编译到程序的可执行文件中,故它们不会丢失。使用资源时使用前缀:/。例如:/images/icon.png。除图片外,资源可以是任何格式的文件,这将在第12章里介绍。

 

 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

3.1 继承QMainWindow类(Subclassing QMainWindow) 的相关文章

  • 使用 javascript/jQuery 更改类的背景颜色属性

    这似乎是一个简单的问题 但没有任何解决办法 我正在尝试使用 javascript jQuery 动态更改某些文本的背景颜色 从白色或粉色到绿色 但由于某种原因它不起作用 文本使用名为 novice 的 CSS 类进行样式设置 这是CSS 这
  • 我的 QSqlQueryModel 不在列表视图中显示数据

    我正在玩 QSqlQueryModel 但我现在完全陷入困境 我一整天都在寻找解决方案 但到目前为止还没有运气 我所做的工作是它从我的 sqlite 数据库中提取数据 但由于某种原因我无法在列表视图中显示它 我的角色名似乎不存在 对于我从数
  • 获取运行时提供的类名的 n 维数组的类

    给定一个完全限定的类名和多个维度 我想获取该类的类名 我相信我可以这样做 public Class elementType Class forName className return Array newInstance elementTy
  • 在 init 之外在 java 中创建对象

    因此 对于我正在创建的游戏 我有一些扩展 GameDriver 的类 到目前为止 在所有其他类上我都能够扩展 GameDriver 然后在 GameDriver 中我可以执行以下操作 ArrayList
  • 单击按钮本地化应用程序

    我在我的项目 mainMaster 页面中找到了 imageButtons
  • [本机]:在Qt for Android中使用Java函数和第3方库[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 最近我用qt写了一个android应用程序 但我有一个很大的问题 我可以使用 调用一些原生的android API 比如调用特殊的activit
  • Qt GUI 编程设计

    我正在尝试创建一个 GUI 应用程序 主窗口 一个QMainWindow 包含 9 个固定大小的标签以及主窗口的大小 我尝试在没有 Qt GUI Designer 的情况下以编程方式制作它 该项目构建时没有错误 但我看不到主窗口上显示的任何
  • 如何将图标放置到 QLineEdit 上?

    stackoverflow com 网站的右上角有一个带有放大镜头的搜索字段和一个灰色的 搜索 关键字 我想知道是否有可能实现相同的外观QLineEdit 如果是这样那怎么办 QLineEdit lineEdit new QLineEdit
  • Qt 支持在 QIcon 中为 SVG 着色

    看来 Qt 不支持 SVG 中路径标签上的描边 填充选项
  • QTableView 中的虚拟列?

    我开始学习 Qt4 模型 视图编程 我有初学者问题 我有一个简单的应用程序 其中显示 sqlite 表QTableView class Model QtSql QSqlTableModel def init self parent None
  • 如何查看Android Asset资源?

    我想检查 assets 文件夹中是否存在文件 我怎样才能做到呢 请帮忙 我向我的应用程序类之一添加了一个辅助方法 我假设 应用程序运行时 资产列表不会更改 the List
  • .class 与 .java

    class 文件和 java 文件有什么区别 我正在尝试让我的小程序工作 但目前我只能在 Eclipse 中运行它 还不能嵌入 HTML 谢谢 编辑 那么如何使用 JVM 进行编译呢 class 文件是编译后的 java 文件 java 都
  • 程序意外完成 - QT Creator

    我正在尝试使用 QT Creator 使用 QT 框架开发 GUI 控制台应用程序 我使用的是Windows XP 我安装了QT 4 8 3和mingw 两者均已安装 没有任何错误 然后我安装了QT Creator QT 版本 路径中的 Q
  • 当我尝试构建 Qt 4.7.1 静态库时,“找不到 -ljscore”

    我尝试从最新的源构建静态 Qt 库 但出现以下错误 usr bin ld cannot find ljscore collect2 ld returned 1 exit status 如何解决这个问题呢 这是 Qt 构建系统中自 4 7 0
  • Excel - 查找列中不是错误或空白的最后一个值

    我需要在 Excel 电子表格的一列中找到最后一个非错误 非空白值 该列可以有多个 N A 实例 它们与实际值交替 有多种解决方案可用于查找最后一个非空单元格 但这些解决方案不考虑错误 特别是如果最后一个非空单元格出现错误 在这种情况下 解
  • 以编程方式检查 .class 文件是否扩展特定类

    我有一个问题 我已经尝试解决好几个小时了 在 Eclipse 插件中 我有一个 ArrayList 其中包含一些 java class 文件的完整路径 作为字符串 我想做的是检查列表中包含的类是否扩展了特定的类 我考虑过解析该文件 查找 e
  • Qt 创建者 + MITK (Linux)

    我正在尝试使用MITK 与 Qt Creator 我已经通过 ccmake 成功编译并使用了 VTK 和 ITK 我已经编译了 MITK超级建造模式 它下载 CTK VTK ITK 等 然后我就配置好了 我已经用 make 编译了 大约两个
  • Qt - 如何粘合两个窗口并将它们移动在一起?

    就像qmmp Qt 音乐播放器ui设计一样 这两个或三个窗口实际上在同一个窗口中 因为只有一个dock图标 并且这些窗口可以一起移动并相互附着 我看了源码 好像有用QDockWidget 但我真的不知道如何获得它的细节 当您手动移动辅助窗口
  • 如何在带有预编译头的项目中使用google protobuf

    我有一个包含多个项目的解决方案 我的项目 但不是全部 使用预编译头 我决定使用 protobuf 但遇到了一个问题 在 protoc exe 从 proto 生成 pb h 后 我尝试包含标头并收到错误 预编译标头未包含在 pb h 中 我
  • 本地化 ASP.NET 资源的滑动过期

    假设我们有 2 个站点 myDomain AU 和 myDomain RU 具有相同的代码和本地化资源文件 resx 和 ru resx 我们预计大多数英语用户将使用 AU 网站 大多数俄语用户将使用 RU 网站 但是 如果 AU 域的某些

随机推荐

  • AndroidManifest详解之Application(有图更好懂)

    能够包含的标签
  • 如何有效进行RLHF的数据标注?

    编者按 随着大语言模型在自然语言处理领域的广泛应用 如何从人类反馈进行强化学习 RLHF 已成为一个重要的技术挑战 并且RLHF需要大量高质量的人工数据标注 这是一个非常费力的过程 本文作者在数据标注领域具有丰富经验 他在本文深入探讨了RL
  • 【大数据】Kafka 入门指南

    Kafka 入门指南 1 Kafka 简介 2 Kafka 架构 3 分区与副本 4 偏移量 5 消费者组 6 总结 1 Kafka 简介 Apache Kafka 是一种高吞吐 分布式的流处理平台 由 LinkedIn 开发并于 2011
  • makefile和make简单笔记

    1 makefile和make的关系 make命令相当于makefile的解析器 2 makefile基本格式 3 make的简单原理 linux文件的数据部分会记录文件的访问和修改时间 atime mtime ctime make会获取依
  • Log4j2 RCE漏洞及靶场搭建

    漏洞简介 Apache Log4j2是一款Java日志框架 是Log4j 的升级版 可以控制每一条日志的输出格式 通过定义每一条日志信息的级别 能够更加细致地控制日志的生成过程 该漏洞是由于Apache Log4j2某些功能存在递归解析功能
  • Linux网络服务:网络设置与基础服务1

    目录 一 理论 1 查看网络配置 2 测试网络连接 3 使用网络配置命令 4 修改网络配置文件 5 DHCP服务 二 实验 1 本地DHCP服务器搭建 2 问题 一 理论 1 查看网络配置 1 使用ifconfig命令查看网络接口地址 主机
  • 服务器机房监控系统研究,远程机房动环监控系统的设计与实现

    摘要 随着国家对电信建设的大力推进 各地的基站机房越来越多 企业也开始通过自建机房来提高网络服务质量 机房内汇聚大量高精密电子设备 一旦这些电子器件发生故障 例如机房温湿度偏高造成电路板老化或者失灵等等 如果没有及时监管到位 极易造成运行设
  • 【芯片设计封装与测试】芯片测试目的、方法、分类及案例

    目录 1 芯片测试概述 目的 方法 1 1 测试在芯片产业价值链上的位置 2 测试如何体现在设计的过程中 2 1 半导体测试定义与基本工作机制 2 2 半导体测试环节分类及对应设备 2 3 设计验证 3 测试的各种类型 3 1 抽样测试和生
  • 数值数据表示(一) ※

    第1关 基础习题 1 1 请编写一个Python程序 实现十进制整数到二进制整数的转换 2 请编写一个Python程序 实现十进制小数到二进制小数的转换 请注意 length参数用于指定转换后二进制位数 3 请编写一个Python程序 实现
  • Android开发黑白灰模式和夜间模式设置

    接口数据来源鸿洋大神 玩安卓 网站 https wanandroid com 黑白灰正常模式和黑白灰夜间模式截图 夜间模式与正常模式截图 黑白灰与原色模式设置 设置灰白色 protected void setGrayScreen Paint
  • 解决thinkphp关闭调试模式404报错问题

    在使用Thinkphp框架进行开发项目 往往在上线之前 需要关闭调试模式 但这时候发现原本访问正常的网页 在关闭调试模式之后无法访问 报错404 问题回顾 当设置项目开启调试模式时 define APP DEBUG True 访问服务 正常
  • Unity3d之多人游戏与网络(联机冰球对战)

    Unity3d之联机冰球对战 1 游戏简介 一个简单的联机冰球对战小游戏 双方可在自己的视角分别控制 2 效果 静态图 动态图 3 预备知识 Unity网络编程相关组件 3 1 浅谈个人对多人游戏与网络的一些看法 网络游戏可以说是目前最吸引
  • Unity 通过Mesh网格渲染绘制图形与字体

    任何一个模型都是由若干网格面组成 而每一个面又有若干个三角形组成 也就是说 模型是由若干个三角形面组成的 字体和图片也是如此 组成简单模型的组件需要包含以下几个 MeshImage脚本代码如下 using UnityEngine using
  • 针对流只能消费一次的处理方案

    最近在处理文件mimeType有关问题时 因为流只能消费一次的问题 引发了一些bug Stream流只能被 消费 一次 一旦遍历过就会失效 就像容器的迭代器那样 想要再次遍历必须重新生成 遇到这个问题 第一反应是尝试深拷贝 使用hutool
  • Unity2D横版游戏地形生成

    演示视频 横版地形生成 功能 将地形素材赋值给脚本 脚本会生成对应的地形素材 可以控制生成素材的高度 生成的时间间隔 是否每次随机时间生成 会有一个范围值来进行控制 Mountain 01 transf为山脉生成的起始位置 后续的生成变化都
  • c语言12与31进行异或,C语言版DES算法.doc

    C语言版DES算法 明文可以通过MAX设置明文的最大位数 明文和密钥中都可以有空格 完成者 周红福 邮箱 zhouhongfu2012 163 com include include define MAX 100 初始置换表int Ip 6
  • 地图上分成一块一块区域 高德地图_干货

    经常有开发者提问 是否可以只显示某个国家 某个省区 甚至某个小区的地图信息 以前我们只能遗憾地告诉你 不行 或者使用一个带洞的无限大多边形作为遮罩来实现相似效果 可是今天 我们开发了更加便捷的方式 于是 你可以做到了 在专业GIS领域 这种
  • [培训-DSP快速入门-3]:C54x DSP内存资源与内存空间分布

    作者主页 文火冰糖的硅基工坊 https blog csdn net HiWangWenBing 本文网址 https blog csdn net HiWangWenBing article details 118958134 目录 第1部
  • Python常用库的用法介绍都给大家整理出来啦,非常实用,建议收藏

    前言 随着大数据和人工智能的发展 Python也与多种科技深深绑定 比如自动化测试 运维 爬虫 数据分析 机器学习 金融领域 后端开发 云计算 游戏开发都有涉及 万丈高楼平地起 Python这座大厦能够如此强大 就是拥有强大的成千上万的库的
  • 3.1 继承QMainWindow类(Subclassing QMainWindow)

    3 1 继承QMainWindow类 一个应用程序的主窗口要从QMainWindow继承 我们在第二章看到的创建对话框的方法可以用来创建主窗口 QDialog和QMainWindow都是继承自QWidget类 主窗口可用Qt Designe