如何通过Qt中的菜单锁定所有工具栏?

时间:2016-06-23 09:09:42

标签: c++ qt contextmenu toolbar

我正在尝试使用Qt Creator和Application Example

我想在工具栏菜单中添加一个可检查的菜单条目,其中显示“锁定工具栏”,并在选中时锁定所有工具栏的位置。我想这是一个很常见的功能。

我设法通过以下方法找到锁定单个条的命令:

toolBar->setMovable(false);

但我无法弄清楚如何锁定所有工具栏。

修改

此问题过去包含有关工具栏上下文菜单的查询,而不是标准菜单。由于我在其他地方得到了关于上下文菜单的答案,我将其从这个问题中删除了。

How to add an entry to toolbar context menu in qt?

2 个答案:

答案 0 :(得分:1)

以下是如何实现它的示例。首先,添加QActionQMenu;另外,声明所有工具栏都是私有的:

private:
    QMenu*     m_pLockMenu;

    QToolBar*  m_pFileToolBar;
    QToolBar*  m_pEditToolBar;
    QToolBar*  m_pHelpToolBar;

    QAction*   m_pLockAction;

另外,声明一个插槽,您将在触发操作时管理工具栏的锁定:

public slots :
    void lockActionTriggered();

实施您的广告位。您只需要锁定所有工具栏:

void lockActionTriggered()
{
    m_pFileToolBar->setMovable(false);
    m_pEditToolbar->setMovable(false);
    m_pHelpToolBar->setMovable(false);
}

现在,您只需要在.cpp中声明主窗口,并在其中添加菜单,工具栏和操作:

QMainWindow* mainWindow = new QMainWindow();

m_pLockMenu = mainWindow->menuBar()->addMenu("Lock Toolbars");

m_pFileToolBar = mainWindow->addToolBar("File");
m_pEditToolBar = mainWindow->addToolBar("Edit");
m_pHelpToolBar = mainWindow->addToolBar("Help");

m_pLockAction = new QAction("Lock", this);

现在,将操作添加到菜单中:

m_pLockMenu->addAction(m_pLockAction);

将QAction的信号triggered()连接到您的插槽:

connect(m_pLockAction, SIGNAL(triggered()), this, SLOT(lockActionTriggered()));

不要忘记show()主窗口:

mainWindow->show();

现在应该可以了!

修改

您的代码必须如下所示:

mainwindow.h

class MainWindow : public QMainWindow
{

...

private:
    QMenu*     m_pLockMenu;

    QToolBar*  m_pFileToolBar;
    QToolBar*  m_pEditToolBar;
    QToolBar*  m_pHelpToolBar;

    QAction*   m_pLockAction;

public slots :
    void lockActionTriggered();
};

main.cpp

int main(int argc, char *argv[])
{

    ...
    QApplication app(argc, argv);
    MainWindow window;
    window.show();

    app.exec();

}

mainwindow.cpp

void MainWindow::createActions()
{
    m_pLockMenu = menuBar()->addMenu("Lock Toolbars");

    m_pFileToolBar = addToolBar("File");
    m_pEditToolBar = addToolBar("Edit");
    m_pHelpToolBar = addToolBar("Help");

    m_pLockAction = new QAction("Lock", this);

    m_pLockMenu->addAction(m_pLockAction);

    connect(m_pLockAction, SIGNAL(triggered()), this, SLOT(lockActionTriggered()));

    ...
}

void MainWindow::lockActionTriggered()
{
    m_pFileToolBar->setMovable(false);
    m_pEditToolbar->setMovable(false);
    m_pHelpToolBar->setMovable(false);
}

答案 1 :(得分:1)

如果你有一个指向主窗口的指针,你可以简单地找到所有工具栏并迭代它们:

// in slot
for (auto *t: mainWindow->findChildren<QToolBar*>())
    t->setMovable(false);

或者,您可能希望在初始化UI时将所有工具栏连接到单个切换操作:

// in constructor
for (auto *t: this->findChildren<QToolBar*>())
    connect(action, &QAction::toggled, t, &QToolBar::setMovable);