我是 Qt GUI 的新手,最初想配置一个 Qt Dock 小部件,该小部件在按下某个键(假设为“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;
}
将按键绑定到操作,由 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);
当用户键入给定快捷方式的按键序列时,会发出快捷方式的 activate() 信号。 (在不明确的情况下,会发出 activateAmbigously() 信号。)当快捷方式的父窗口小部件正在接收事件时,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
(在这两种情况下,我测试了所有提供的快捷键:A,B,Ctrl+B,以及单击按钮。)
我想知道OP声称
但是经过一番研究,我没有找到任何相关的解决方案。
也许,使用术语“快捷键”或“加速键”会更容易。否则,OP应该找到一些东西,例如
SO:如何在 Qt 中使用两个键修饰符设置 3 键序列快捷键?
我认为这可能是重复的。