cad不显示菜单栏和工具栏,2020cad菜单栏和工具栏都不见了
终极管理员 知识笔记 139阅读
目的
端应用程序或者编辑器基本都支持工具栏快捷功能的动态增删即通过在菜单栏上打钩就可以在工具栏上看到相应功能的快捷按钮取消打钩则在工具栏上就移除了该功能的快捷按钮。那么Qt如何实现这个功能本篇目的就是记录实现此功能的方法及思路。
效果先看下动态效果

菜单栏动态添加动作到工具栏

介绍
首先说下菜单栏工具栏和状态栏区别
菜单栏一般在窗体标题的下方有下拉选项和可有多级子菜单。工具栏一般在菜单栏下方可上下左右四个方向调整位置默认在菜单栏下方即上方向方便操作直接点击即可触发想要的工作。状态栏一般在窗体最下方用于永久或者暂时显示某些状态信息等。UI如下图所示
可在帮助
里选择索引
输入想查找的类比如qmenubar
一般选择第一个结果可根据需要选择其他会弹出选择主题
选择库版本
会跳到对应的类介绍页
点击More...
会跳到Detailed Description
查看此类详细介绍或者点击Public Functions
查看此类公有成员方法。
triggered(bool checked)
信号绑定槽然后根据checked
状态进行工具栏动态创建动作或者移除动作当点击工具栏动作时触发动作实际功能 示例 mainwindow.h
#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include <QToolBar>namespace Ui {class MainWindow;}class MainWindow : public QMainWindow{ Q_OBJECTpublic: 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 <QDebug>#include <QMessageBox>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 <QApplication>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之后会消失。
结论学以致用。
标签: