【问题标题】:How to lock all toolbars via menu in Qt?如何通过Qt中的菜单锁定所有工具栏?
【发布时间】:2022-02-15 23:35:01
【问题描述】:

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

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

我设法找到了一个通过 :

锁定单条的命令
toolBar->setMovable(false);

但我不知道如何锁定所有工具栏。

编辑

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

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

【问题讨论】:

  • 我看不到您所做的更改。我现在需要离开,但肯定会在明天尝试。期待!
  • @IAmInPLS 我仍然收到error: 'm_pLockMenu' does not name a type 消息。您确定不必将 mainwindow.cpp 的代码放入某个特定的上下文中吗?
  • 您是否包含了 ?...
  • @IAmInPLS 不,我这里有源代码:doc.qt.io/qt-5/qtwidgets-mainwindows-application-example.html(在页面的最底部都是我拥有的文件),然后将您的代码添加到其中。
  • @IAmInPLS 好的,开始工作了。但它不会向上下文菜单添加任何内容。相反,它会创建一个“普通”菜单,对吧?

标签: c++ qt contextmenu toolbar


【解决方案1】:

这是一个如何实现它的示例。首先,添加一个QAction和一个QMenu;另外,将所有工具栏声明为私有:

private:
    QMenu*     m_pLockMenu;

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

    QAction*   m_pLockAction;

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

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);
}

【讨论】:

  • 非常感谢。我还不能让它工作。可能是因为我不完全确定在哪里添加和删除东西。所以privatepublic slots 进入mainwindow.hvoid lockActionTriggered() 进入 mainwindow.cpp。其余的进入int main(...)main.cpp?
  • 不,主要你应该只调用你的类MainWindow(我认为这是 QMainWindow 的子类)。我向您展示的所有内容都在 mainwidnow.h 和 mainwindow.cpp 中。在你的主要,只是做类似MainWindow window; window.show();
  • 谢谢。现在我知道应该在main.cpp 中添加什么。还是行不通。我从 Qt 示例开始。所以有三个文件main.cppmainwindow.cppmainwindow.h。所以我只添加了MainWindow window; window.show();main.cpp。我已将privatepublic slots 声明添加到mainwindow.h。那么剩下的到底应该去哪里呢?直接进入mainwindow.cpp 不起作用。
  • 编辑您的问题以显示更多代码和/或您遇到的错误。
【解决方案2】:

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

// 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);

【讨论】:

    【解决方案3】:

    灵活锁定选项的一个常见示例

    # Created by BaiJiFeiLong@gmail.com at 2022/2/15 22:56
    import typing
    
    from PySide2 import QtWidgets, QtGui, QtCore
    
    
    class Window(QtWidgets.QMainWindow):
        def createPopupMenu(self) -> QtWidgets.QMenu:
            menu = super().createPopupMenu()
            menu.addSeparator()
            toolBars: typing.Sequence[QtWidgets.QToolBar] = self.findChildren(QtWidgets.QToolBar)
            for toolbar in toolBars:
                if toolbar.rect().contains(toolbar.mapFromGlobal(QtGui.QCursor.pos())):
                    title = "%s %s" % ("Lock" if toolbar.isMovable() else "Unlock", toolbar.windowTitle())
                    menu.addAction(title, lambda toolbar=toolbar: toolbar.setMovable(not toolbar.isMovable()))
            menu.addSeparator()
            if any(x.isMovable() for x in toolBars):
                menu.addAction("Lock All", lambda: list(x.setMovable(False) for x in toolBars))
            if any(not x.isMovable() for x in toolBars):
                menu.addAction("Unlock All", lambda: list(x.setMovable(True) for x in toolBars))
            return menu
    
    
    app = QtWidgets.QApplication()
    window = Window()
    window.setWindowTitle("Toolbar Example")
    for i in range(1, 6):
        toolBar = window.addToolBar(f"ToolBar{i}")
        toolBar.setMovable(i % 2 == 0)
        toolBar.addWidget(QtWidgets.QPushButton(f"ToolBar {i}"))
    label = QtWidgets.QLabel("Ready")
    label.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
    window.setCentralWidget(label)
    window.resize(800, 600)
    window.show()
    app.exec_()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多