QT5开发及实例学习之十Qt5主窗口构成


一、基本元素

  QMainWindow是一个为用户提供主窗口程序的类,包含一个菜单栏(menu bar)、多个工具栏(tool bars)、多个锚接部件(dock widgets)、一个状态栏(status bar)及一个中心部件(central widget),是许多应用程序的基础。

1.菜单栏

  菜单是一系列命令的列表。为了实现菜单、工具栏按钮、键盘快捷方式等命令一致性,Qt使用动作(Action)来表示这些命令。Qt的菜单就是由一系列的QAction动作对象构成的列表,而菜单栏则是包容菜单的面板,它位于主窗口标题栏的下面。一个主窗口只能有一个菜单栏。

2.状态栏

  状态栏通常显示GUI应用程序的一些状态信息,,它位于主窗口的底部。用户可以在状态栏上添加、使用Qt窗口部件。一个主窗口只能有一个状态栏。

3.工具栏

  工具栏是由一系列的类似于按钮的动作排列而成的面板,它通常由一些经常使用的命令组成。工具栏位于菜单栏的下面、状态栏的上面,可以停靠在主窗口的上、下、左、右是几个方向上。一个人主窗口可以包含多个工具栏。

4.锚接部件

  锚接部件作为一个容器使用,以包容其他窗口部件来实现某些功能。例如,Qt设计器的属性编辑器、对象监视器等都是由锚接部件包容其他的Qt窗口部件来实现的。它位于工具栏区的内部,可以作为一个窗口自由地浮动在主窗口上面,也可以像工具栏一样停靠在主窗口的上、下、左、右四个方向上。一个主窗口可以包含多个锚接部件。

5.中心部件

  中心部件处在锚接部件的内部、主窗口的中心。一个主窗口只能有一个中心部件。
  注意:主窗口具有自己的布局管理器,因此在主窗口QMainWindow上设置布局管理器或者创建一个父窗口部件作为QMainWindow的布局管理器都是不允许的。但可以在主窗口的中心部件上设置管理器。

6.激活上下文菜单

  为了控制主窗口工具栏和锚接部件的显隐,在默认情况下,主窗口QMainWindow提供了一个上下文菜单(Context Menu)。通常,通过在工具栏或锚接部件上单击鼠标右键就可以激活该上下文菜单,也可以通过函数QMainWindow::createPopupMenu()激活该菜单。此外,还可以重写QMainWindow::createPopupMenu()函数,实现自定义的上下文菜单。

二、文本编辑器示例

  QMainWindow主窗口的创建流程和各种功能开发。
(1)文件操作功能:包括新建一个文件,利用标准文件对话框QFileDialog类打开一个已存在的文件,利用QFile和QTextStream读取文件内容,打印文件(分文本打印和图片打印)。通过标准打印对话框QPrintDialog类的使用方法,以QPrinter作为QPaintDevice画图工具实现图片打印。
(2)图片处理中的常用功能:包括图片的缩放、旋转、镜像等坐标变换,使用QMatrix实现图片的各种坐标变换。
(3)开发文本编辑功能:通过在工具栏上设置文字字体、字号大小、加粗、斜体、下划线及字体颜色等快捷按钮的实现,介绍在工具栏中嵌入控件的方法。其中,通过设置字体颜色功能,介绍标准颜色对话框QColorDialog类的使用方法。
(4)排版功能:通过选择某种排序方式实现对文本排序,以及实现文本对齐(包括左对齐、右对齐、居中对齐和两端对齐)和撤销、重做的方法。

代码如下(示例):

ImgProcessor::ImgProcessor(QWidget *parent)
    : QMainWindow(parent)
{
    setWindowTitle(QObject::tr("Easy Word"));
    showWidget = new ShowWidget(this);	//创建放置图片QLabel和文本编辑框QTextEdit的QWidget对象showWidget
    setCentralWidget(showWidget);   //将QWidget对象设置为中心部件
    /* 创建动作、菜单、工具栏的函数 */
    createActions();
    createMenus();
    createToolBars();
    if(img.load("image.png"))
    {
        //在 imageLabel 对象中放置图片
        showWidget->imageLabel->setPixmap(QPixmap::fromImage(img));
    }
}

三、菜单与工具栏的实现

  菜单与工具栏都与QAction类密切相关,工具栏上的功能按钮与菜单中的选项条目相对应,完成相同的功能,使用相同的快捷键与图标。QAction类为用户提供了一个统一的命令接口,无论是从菜单触发还是从工具栏触发,或通过快捷键触发都调用同样的操作接口,以达到同样的目的。

1. 动作(Action)的实现

	void ImgProcessor::createActions()
	{
	    //"打开"动作
	    openFileAction = new QAction(QIcon("open.png"), QObject::tr("打开"), this);	//(a)
	    openFileAction->setShortcut(QObject::tr("Ctrl+O"));							//(b)
	    openFileAction->setStatusTip(QObject::tr("打开一个文件"));					//(c)
	    //"新建"动作
	    ...
    }

(a)在创建“打开文件”动作的同时,指定了此动作使用的图标、名称及父窗口。
(b)设置此动作的组合键为Ctrl+O。
(c)设定了状态栏显示,当鼠标光标移动至此动作对应的菜单条目或工具栏按钮上时,在状态栏上显示“打开一个文件”的提示。
  在创建动作时,也可不指定图标。这类动作通常只在菜单中出现,而不在工具栏上使用。

2. 菜单(Menus)的实现

  在实现了各个动作之后,需要将它们通过菜单、工具栏或快捷键的方式体现出来。

	void ImgProcessor::createMenus()
	{
	    //文件菜单
	    fileMenu = menuBar()->addMenu(QObject::tr("文件"));	//(a)
	    fileMenu->addAction(openFileAction);				//(b)
	 	...
	}

(a)直接调用 QMainWindow 的 menuBar() 函数即可得到主窗口的菜单栏指针,再调用菜单栏 QMenuBar 的 addMenu() 函数,即可完成在菜单栏中插入一个新菜单 fileMenu,fileMenu 为一个 QMenu 类对象。
(b)调用 QMenu 的 addAction() 函数在菜单中加入菜单条目“打开”、“新建”、“打印文本”、“打印图片”、“缩放”、“旋转”、“镜像”。

3. 工具栏(ToolBars)的实现

  接下来实现相对应的工具栏 createToolBars(),主窗口的工具栏上可以有多个工具条,通常采用一个菜单对应一个工具条的方式,也可以根据需要进行工具条的划分。

	void ImgProcessor::createToolBars()
	{
	    //文件工具条
	    fileTool = addToolBar(QObject::tr("File"));	//(a)
	    fileTool->addAction(openFileAction);		//(b)
		...
	}

(a)直接调用 QMainWindow 的 addToolBar() 函数即可获得主窗口的工具条对象,每新增一个工具条调用一次addToolBar()函数,赋予不同的名称,即可在主窗口中新增一个工具条。
(b)调用 QToolBar 的 addAction() 函数在工具条中插入属于本工具条的动作。类似地,实现“编辑工具条”、“旋转工具条”、“撤销和重做工具条”。工具条的显示可以由用户进行选择,在工具栏上单击鼠标右键将弹出工具条显示的选择菜单,用户对需要显示的工具条进行选择即可。

  工具条是一个可移动的窗口,它可停靠的区域由 QToolBar 的 allowAreas 决定,包括 Qt::LeftToolBarArea 、Qt::RightToolBarArea 、Qt::TopToolBarArea 、Qt::BottomToolBarArea 和 Qt::AllToolBarAreas 。默认为 Qt::AllToolBarAreas ,启动后默认出现于主窗口的顶部。可通过调用 setAllowedAreas() 函数来指定工具条可停靠的区域,例如:

	//此函数限定文件工具条只可出现在主窗口的顶部或左侧。
	fileTool->setAllowedAreas(Qt::TopToolBarArea | Qt::LeftToolBarArea);

  工具条也可通过调用 setMovable()函数设定可移动性,例如:

	//指定文件工具条不可移动,只出现于主窗口的顶部
	fileTool->setMovable(false);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值