端应用程序或者编辑器基本都支持工具栏快捷功能的动态增删,即通过在菜单栏上打钩就可以在工具栏上看到相应功能的快捷按钮,取消打钩则在工具栏上就移除了该功能的快捷按钮。那么Qt如何实现这个功能,本篇目的就是记录实现此功能的方法及思路。
先看下动态效果:
菜单栏动态添加动作到工具栏
首先,说下菜单栏,工具栏和状态栏区别:
可在帮助
里,选择索引
,输入想查找的类,比如qmenubar
,一般选择第一个结果(可根据需要选择其他),会弹出选择主题
,选择库版本
,会跳到对应的类介绍页
点击More...
,会跳到Detailed Description
,查看此类详细介绍,或者点击Public Functions
查看此类公有成员方法。
triggered(bool checked)
信号checked
状态,进行工具栏动态创建动作或者移除动作mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
void setAction(QToolBar* pTB, QAction* pActSender, bool checked);
private slots:
void on_actionact11_triggered(bool checked);
void on_actionact12_triggered(bool checked);
void on_actionact21_triggered(bool checked);
void on_actionact22_triggered(bool checked);
void on_actionact31_triggered(bool checked);
void on_actionact32_triggered(bool checked);
void on_actionact33_triggered(bool checked);
private:
Ui::MainWindow *ui;
QToolBar* m_pTB1;
QToolBar* m_pTB2;
QToolBar* m_pTB3;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include
#include
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_pTB1 = new QToolBar("tb1");
m_pTB2 = new QToolBar("tb2");
m_pTB3 = new QToolBar("tb3");
addToolBar(m_pTB1);
addToolBar(m_pTB2);
addToolBar(m_pTB3);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::setAction(QToolBar *pTB, QAction *pActSender, bool checked)
{
if(checked){
foreach (QAction* pAct, pTB->actions()) {
if(pAct->text().compare(pActSender->text()) == 0)
{
return;
}
}
QAction* pActClone = new QAction(pActSender->text(), this);
connect(pActClone, &QAction::triggered, this, [this, pActClone](){
ui->statusBar->showMessage(QString("我是 %1").arg(pActClone->text()), 2000);
QMessageBox::information(this, "提示", QString("我是 %1").arg(pActClone->text()));
});
pTB->insertAction(0, pActClone);
}
else {
foreach (QAction* pAct, pTB->actions()) {
if(pAct->text().compare(pActSender->text()) == 0)
{
pTB->removeAction(pAct);
return;
}
}
}
}
void MainWindow::on_actionact11_triggered(bool checked)
{
QAction* pActSender = dynamic_cast<QAction*>(sender());
setAction(m_pTB1, pActSender, checked);
}
void MainWindow::on_actionact12_triggered(bool checked)
{
QAction* pActSender = dynamic_cast<QAction*>(sender());
setAction(m_pTB1, pActSender, checked);
}
void MainWindow::on_actionact21_triggered(bool checked)
{
QAction* pActSender = dynamic_cast<QAction*>(sender());
setAction(m_pTB2, pActSender, checked);
}
void MainWindow::on_actionact22_triggered(bool checked)
{
QAction* pActSender = dynamic_cast<QAction*>(sender());
setAction(m_pTB2, pActSender, checked);
}
void MainWindow::on_actionact31_triggered(bool checked)
{
QAction* pActSender = dynamic_cast<QAction*>(sender());
setAction(m_pTB3, pActSender, checked);
}
void MainWindow::on_actionact32_triggered(bool checked)
{
QAction* pActSender = dynamic_cast<QAction*>(sender());
setAction(m_pTB3, pActSender, checked);
}
void MainWindow::on_actionact33_triggered(bool checked)
{
QAction* pActSender = dynamic_cast<QAction*>(sender());
setAction(m_pTB3, pActSender, checked);
}
ui
// ui的话,主要是添加一些菜单和动作,工具栏是代码实现的
// 动作名称
main.cpp
#include "mainwindow.h"
#include
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
以上示例,主要函数为:
private:
void setAction(QToolBar* pTB, QAction* pActSender, bool checked);
void MainWindow::setAction(QToolBar *pTB, QAction *pActSender, bool checked)
{
if(checked){
foreach (QAction* pAct, pTB->actions()) {
if(pAct->text().compare(pActSender->text()) == 0)
{
return;
}
}
QAction* pActClone = new QAction(pActSender->text(), this);
connect(pActClone, &QAction::triggered, this, [this, pActClone](){
ui->statusBar->showMessage(QString("我是 %1").arg(pActClone->text()), 2000);
QMessageBox::information(this, "提示", QString("我是 %1").arg(pActClone->text()));
});
pTB->insertAction(0, pActClone);
}
else {
foreach (QAction* pAct, pTB->actions()) {
if(pAct->text().compare(pActSender->text()) == 0)
{
pTB->removeAction(pAct);
return;
}
}
}
}
根据传入的参数,进行工具栏动态的创建。
此外:
ui->statusBar->showMessage(QString("我是 %1").arg(pActClone->text()), 2000);
上述代码是 暂时显示文本,时间是2000ms,之后会消失。
学以致用。