【问题标题】:How to correctly configure QDockWidget for it to show/hide?如何正确配置 QDockWidget 以使其显示/隐藏?
【发布时间】:2019-07-25 12:13:38
【问题描述】:

我是 Qt GUI 的新手,最初想配置一个 Qt Dock Widget,它在按下一个键时显示,比如“A”,当按下另一个键时隐藏,比如“B”。但是经过一番研究,我没有找到任何相关的解决方案。

我尝试创建一个切换按钮,第一次按下时会显示停靠小部件,再次按下时会隐藏它。它工作正常,但有什么办法可以做得更好或分配任何键来显示和隐藏停靠小部件?

t_button = new QPushButton("B1",this);

dockB = new QDockWidget(tr("Panel B"),this);
dockB -> setAllowedAreas(Qt::AllDockWidgetAreas);
addDockWidget(Qt::RightDockWidgetArea,dockB);
dockB -> hide();

connect(t_button,SIGNAL(clicked()),this,SLOT(toggle()));

void MainWindow::toggle()
{
    if(!click)
        dockB->show();
    else
        dockB->hide();
    click=!click;
}

【问题讨论】:

  • 这个QDockWidget::toggleViewAction() 可能也很有趣。

标签: qt widget qt5 qdockwidget


【解决方案1】:

要将按键绑定到操作,QShortCut 负责。

QShortcut 类提供了一种将键盘快捷键连接到 Qt 的信号和插槽机制的方法,以便在执行快捷键时通知对象。快捷方式可以设置为包含描述键盘快捷方式所需的所有按键,包括 Shift、Ctrl 和 Alt 等修饰键的状态。

在某些小部件上,在字符前使用“&”会自动为该字符创建助记符(快捷方式),例如"E&xit" 将创建快捷方式 Alt+X(使用 '&&' 显示实际的 & 符号)。小部件可能会使用给定的快捷方式并对其执行操作。在 X11 上,与号将不显示,字符将带有下划线。在 Windows 上,通常在用户按下 Alt 键之前不会显示快捷方式,但这是用户可以更改的设置。在 Mac 上,默认情况下禁用快捷方式。调用 qt_set_sequence_auto_mnemonic() 来启用它们。然而,由于助记快捷键不符合 Aqua 的指导方针,Qt 不会显示快捷键字符下划线。

对于使用菜单的应用程序,使用 QMenu 类中提供的便捷函数在创建菜单项时为其分配键盘快捷键可能更方便。或者,快捷方式可以与 QAction 类中的其他类型的操作相关联。

为特定小部件创建快捷方式的最简单方法是使用按键序列构建快捷方式。例如:

shortcut = new QShortcut(QKeySequence(tr("Ctrl+O", "File|Open")),
                         parent);

当用户键入给定快捷键的按键序列时,会发出该快捷键的激活() 信号。 (在有歧义的情况下,发出activatedAmbiguously() 信号。)当快捷方式的父窗口小部件接收事件时,Qt 的事件循环会“侦听”快捷方式。

小样本testQDockWidgetShortCut.cc

#include <QtWidgets>

int main(int argc, char **argv)
{
  qDebug() << "Qt Version:" << QT_VERSION_STR;
  QApplication app(argc, argv);
  // setup GUI
  QMainWindow qMainWin;
  QDockWidget qDockB("Panel B");
  qDockB.setAllowedAreas(Qt::AllDockWidgetAreas);
  qMainWin.addDockWidget(Qt::RightDockWidgetArea, &qDockB);
  qDockB.hide();
  // a window action to show dock on [A]
  QAction qCmdShowDockB(&qMainWin);
  qCmdShowDockB.setShortcut(QKeySequence("A"));
  qMainWin.addAction(&qCmdShowDockB);
  // a window action to hide dock on [B]
  QAction qCmdHideDockB(&qMainWin);
  qCmdHideDockB.setShortcut(QKeySequence("B"));
  qMainWin.addAction(&qCmdHideDockB);
  // a button to toggle dock B
  QPushButton qBtn(
    "Show/Hide Panel B\n"
    "[A] ... Show Panel B\n"
    "[B] ... Hide Panel B\n"
    "[Ctrl+B] ... Toggle Panel B");
  qBtn.setShortcut(QKeySequence("Ctrl+B"));
  qMainWin.setCentralWidget(&qBtn);
  qMainWin.show();
  // install signal handlers
  QAction *pQCmd = qDockB.toggleViewAction();
  QObject::connect(&qBtn, &QPushButton::clicked, pQCmd, &QAction::trigger);
  QObject::connect(&qCmdShowDockB, &QAction::triggered, &qDockB, &QDockWidget::show);
  QObject::connect(&qCmdHideDockB, &QAction::triggered, &qDockB, &QDockWidget::hide);
  // runtime loop
  return app.exec();
}

一个最小的项目文件testQDockWidgetShortCut.pro:

SOURCES = testQDockWidgetShortCut.cc

QT += widgets

cygwin64上编译和测试:

$ qmake-qt5 testQDockWidgetShortCut.pro 

$ make && ./testQDockWidgetShortCut 
g++ -c -fno-keep-inline-dllexport -D_GNU_SOURCE -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I. -isystem /usr/include/qt5 -isystem /usr/include/qt5/QtWidgets -isystem /usr/include/qt5/QtGui -isystem /usr/include/qt5/QtCore -I. -I/usr/lib/qt5/mkspecs/cygwin-g++ -o testQDockWidgetShortCut.o testQDockWidgetShortCut.cc
g++  -o testQDockWidgetShortCut.exe testQDockWidgetShortCut.o   -lQt5Widgets -lQt5Gui -lQt5Core -lGL -lpthread 
Qt Version: 5.9.4

编译了一个在VS2017和Qt5.13.0中测试过的:

Qt Version: 5.13.0

(在这两种情况下,我测试了所有提供的快捷键:ABCtrl+B ,以及单击按钮。)


我想知道 OP 声称

但经过一番研究,我没有找到任何相关的解决方案。

可能,使用“快捷方式”或“加速键”一词会更容易。否则,OP应该找到一些东西,例如

SO: How to set 3-key sequence shortcut with two key modifiers in Qt?

我认为可能是重复的。

【讨论】:

    猜你喜欢
    • 2010-11-20
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    相关资源
    最近更新 更多