Qt菜单栏、工具栏、状态栏介绍及工具栏action的动态增删显示实现方式

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

一、需求和目的

基本上所有的编辑器都支持工具栏快捷功能的动态增删,即我们在菜单栏上打钩就可以在工具栏上看到相应功能的快捷按钮,取消打钩则在工具栏上就移除了该功能的快捷按钮,那么Qt如何实现这个功能呐,我们本次总结的目的就是记录我解决这个问题的思路和方法。

二、菜单栏、工具栏、状态栏

对于这三个概念先做一个简单的了解,我们直接上一个source insight的图,来说一下什么是菜单栏、工具栏和状态栏:

在这里插入图片描述

最上面的可以下拉的菜单栏,然后是快捷点击的工具栏,最下面的是显示某些状态信息的状态栏。菜单栏的功能一般来说就是最全的,工具栏的内容可以在菜单栏中进行设置以在有限的位置显示出我们需要的常用的一些功能的快捷点击按钮(此外,还有快捷键,这里就不展开了)。

三、Qt菜单栏、工具栏和状态栏的基本操作说明

打开Qt助手,分别搜索menuBar、toolBar、statusBar,找到对应的QMenuBar、QToolBar、QStatusBar的类说明进行了解。基础的应用了解一下其方法和属性(公有的、私有的、受保护的都了解一下)、槽、信号等,再了解一些如何使用的 详细描述以及一些注意事项就可以很快上手了。

在这里插入图片描述

1、QMenuBar:

见名知意一下,使用的时候再具体去看一下,基本没什么问题,下面的是公有方法,还有一些其他的内容在助手上都很详细,根据需要去了解一下即可。

函数 说明
QMenuBar(QWidget *parent = Q_NULLPTR)
~QMenuBar()
QAction *actionAt(const QPoint &pt) const
QRect actionGeometry(QAction *act) const
QAction *activeAction() const
QAction *addAction(const QString &text)
QAction *addAction(const QString &text, const QObject *receiver, const char *member)
QAction *addMenu(QMenu *menu)
QMenu *addMenu(const QString &title)
QMenu *addMenu(const QIcon &icon, const QString &title)
QAction *addSeparator()
void clear()
QWidget *cornerWidget(Qt::Corner corner = Qt::TopRightCorner) const
QAction *defaultAction() const
QAction *insertMenu(QAction *before, QMenu *menu)
QAction *insertSeparator(QAction *before)
bool isDefaultUp() const
bool isNativeMenuBar() const
void setActiveAction(QAction *act)
void setCornerWidget(QWidget *widget, Qt::Corner corner = Qt::TopRightCorner)
void setDefaultAction(QAction *act)
void setDefaultUp(bool )
void setNativeMenuBar(bool nativeMenuBar)
NSMenu *toNSMenu()

详细描述:

QMenuBar类提供了一个水平菜单栏。

菜单栏由下拉菜单项列表组成。使用addMenu()添加菜单项。例如,假设menubar是一个指向QMenuBar的指针,fileMenu是一个指向QMenu的指针,那么下面的语句将菜单插入到菜单栏中:

menuBar->addMenu(fileMenu);

菜单项文本中的&号设置Alt+F作为此菜单的快捷方式。(你可以使用“&&”在菜单栏中得到一个真正的&符号。)

没有必要设置菜单栏。它自动将自己的几何图形设置到父小部件的顶部,并在父小部件调整大小时适当地修改它。

使用

在大多数主窗口样式应用程序中,您将使用QMainWindow中提供的menuBar()函数,将qmenu添加到菜单栏中,并将QActions添加到弹出菜单中。

示例(来自菜单示例):

fileMenu = menuBar()->addMenu(tr(“文件”));
fileMenu->addAction(newAct);

可以使用removeAction()方法删除菜单项。

可以使用QWidgetAction类的实例将小部件添加到菜单中。然后,可以按照通常的方式将这些操作插入到菜单中;有关详细信息,请参阅QMenu文档。

平台依赖的外观和感觉

不同的平台对菜单栏的外观和用户交互时的行为有不同的要求。例如,Windows系统经常被配置为只在按下Alt键时才显示菜单栏中显示键盘快捷键的下划线字符助记符。

其它还有一些在MAC和Win CE上使用的一些说明,这里就不多说了。

2、QToolBar

详细描述:

QToolBar类提供一个包含一组控件的可移动面板。

使用addAction()或insertAction()通过添加操作添加工具栏按钮。可以使用addSeparator()或insertSeparator()分隔按钮组。如果工具栏按钮不合适,可以使用addWidget()或insertWidget()插入小部件。合适的小部件的例子有QSpinBox、QDoubleSpinBox和QComboBox。当按下工具栏按钮时,它会发出actiontrigger()信号。

工具栏可以固定在特定区域(例如窗口顶部),也可以在工具栏区域之间移动;请参阅setMovable()、isMovable()、allowedAreas()和isAreaAllowed()。

当工具栏的大小调整到太小而不能显示它所包含的所有项目时,扩展按钮将作为工具栏中的最后一个项目出现。按下扩展按钮将弹出一个菜单,其中包含当前不在工具栏中的项目。

如果QToolBar不是QMainWindow的子窗口,它就失去了使用addWidget()在工具栏中添加小部件填充扩展弹出框的能力。请使用继承QWidgetAction并实现QWidgetAction::createWidget()创建的小部件操作。

请参阅QToolButton、QMenu、QAction和应用程序示例。

可以看到工具栏还可以插入QSpinBox、QDoubleSpinBox和QComboBox小部件呐,感兴趣的可以试试,此外,点击工具栏按钮时发出的是actiontrigger信号。

3、QStatusBar

QStatusBar类提供了一个适合显示状态信息的水平条。

每个状态指示器分为以下三类:

  • Temporary(暂时的)-暂时占据状态栏的大部分。例如,用于解释工具提示文本或菜单项。
  • Normal(一般的) -占据状态栏的一部分,可能被临时消息隐藏。例如,用于在字处理器中显示页和行号。
  • Permanent(永久的)-永远不会隐藏。例如,一些应用程序将大写锁定指示器放在状态栏中,用于重要的模式指示。

QStatusBar可以显示所有三种类型的指示器。

通常,状态栏功能的请求与QMainWindow对象相关。QMainWindow提供了一个主应用程序窗口,其中包含一个菜单栏、工具栏、停靠小部件和一个围绕大型中央小部件的状态栏。可以使用QMainWindow::statusBar()函数检索状态栏,并使用QMainWindow::setStatusBar()函数替换状态栏。

使用showMessage()显示临时消息:

void MainWindow::createStatusBar()
{
	statusBar()->showMessage(tr(“准备好”));
}

要删除临时消息,请使用clearMessage()槽函数,或在调用showMessage()时设置时间限制。例如:

void MainWindow::print ()
{
#ifndef QT_NO_PRINTDIALOG
	QTextDocument *document = textEdit->document();
	QPrinter printer;

	QPrintDialog dlg(&printer, this);
	if (dlg.exec() != QDialog::Accepted){
		return;
	}

	document->print(&printer);
	statusBar()->showMessage(tr(“Reday”),2000);
# endif
}

使用currentMessage()函数来检索当前显示的临时消息。QStatusBar类还提供了messageChanged()信号,当临时状态消息发生更改时发出该信号。

通过创建一个小部件(QLabel、QProgressBar甚至QToolButton),然后使用addWidget()或addPermanentWidget()函数将其添加到状态栏中,可以显示普通消息和永久消息。使用removeWidget()函数从状态栏删除此类消息。

statusBar()->addWidget(new MyReadWriteIndication);

默认情况下,QStatusBar在右下角提供一个QSizeGrip。您可以使用setSizeGripEnabled()函数禁用它。使用isSizeGripEnabled()函数确定大小手柄的当前状态。

参见QMainWindow, QStatusTipEvent, GUI设计手册:状态栏和应用实例。

由此可以看出状态栏一般都分成三份呐(暂时、一般、永久)。此外,还可以插入小部件别忘记用。

四、工具栏功能在菜单栏进行动态配置的实现思路

1、思路

根据上面的描述,我们可以看到一般就是用addaction和insertaction添加action的,一般我们用Qt设计师设计完后action都已经有了,所以addaction不是很好用了,我这里是用insertaction,但是insert要指定放在哪个action前面,这就麻烦了,我们动态添加的时候不知道前一个action是什么,所以这里就用到了一个小技巧: 在最后设置占位action(占位的action名字设置为|即可),那么我们insertaction时就插入到对应的占位action前面就可以了,即设置空白的action进行占位。 移除就不用多说了,直接removeaction。

使action可选的方式就是设置action为checked即可选的,然后就可以设置enabled来(true、false)显示√了。

定义工具栏的显示与否这里就不说了,很简单,使用其自带的槽函数结合一个action按钮就可以了。

2、结果展示

这里主要演示工具栏的action动态增删,至于状态栏菜单栏的扩展这里就不演示了(图片大小不能超过5M哈)。

在这里插入图片描述

五、最后

学习如何使用Qt创建菜单栏、工具栏和状态栏很简单,按部就班即可,但是如何灵活的运用这些知识来解决实际问题往往需要一些技巧,这些技巧往往就是我们要总结和回顾的经验。

猜你喜欢

转载自juejin.im/post/7117493144656527368