如何正确配置QDockWidget使其显示/隐藏?

2024-03-17

我是 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;
}

要将按键绑定到操作,Q快捷键 https://doc.qt.io/qt-5/qshortcut.html#details负责。

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() 信号。 (在不明确的情况下,将发出activatedAmbigously() 信号。)当快捷方式的父窗口小部件正在接收事件时,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 http://www.cygwin.org:

$ 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

(In both cases, I tested all offered shortcut keys: A, B, Ctrl+B, as well as clicking the button.)


我想知道OP声称

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

也许,使用术语“快捷键”或“加速键”会更容易。否则,OP应该发现一些东西,例如

SO:如何在 Qt 中使用两个键修饰符设置 3 键序列快捷键? https://stackoverflow.com/a/42877119/7478597

我认为这可能是重复的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何正确配置QDockWidget使其显示/隐藏? 的相关文章

随机推荐

  • 即使没有从 HTML 到 PHP 检查,如何获取所有复选框变量?

    我注意到 PHP 似乎只返回选中复选框的值 我想查看复选框列表 而不仅仅是选中复选框的值 有没有办法检测未选中框的变量 我问这个问题是因为我希望能够更新设置 例如 我有一些已选中的选项 但如果用户决定取消选中某个选项 我需要知道该未选中的值
  • 使用 pyinstaller 创建可执行文件时出现分段错误:11

    最近 我创建了一个简单的 python 应用程序 其 GUI 是通过PyQt5图书馆 我已经多次测试了应用程序本身 一切正常 但是 在我尝试使用以下命令将其打包为可执行文件之后pyinstaller 运行生成的可执行文件不会创建 GUI 而
  • 有没有办法获取jQuery ajax上传进度?

    ajax xhr function var xhr new window XMLHttpRequest Upload progress xhr upload addEventListener progress function evt if
  • 如何向此自定义的facet_wrap 添加geom_quantile 图例?

    我最近得到了很大的帮助 https stackoverflow com questions 60655019 why does strip text color from facet wrap not correspond to eleme
  • Mono TLS1.2 问题 - btls-cert-sync“找不到命令”

    Summary 我的公司使用 TargetProcess TP 来跟踪开放项目的进度 并且我们创建了相对较小的代码来将更新导入到 TargetProcess 目前 在提交构建后 我们启动了一个预装了 Mono 的 debian docker
  • 找不到 gradle 3.0.0-alpha4

    几天前 我安装了 android studio 3 0 预览版 之后在稳定版本 studio 2 3 3 中 当我尝试导入项目时 它给了我一个错误 在预览中一切正常 这是一个错误 Error Could not find com andro
  • 访问 CriteriaBuilder 中的 REGEXP_LIKE 函数

    我有一个多标准表单 并使用 CriteriaBuilder 来构建 sql 对于本地联系人条件 我需要使用 regexp like 函数来搜索逗号分隔数字字符串中的数字字符串 即在字符串中搜索 234 例如 1234 2345 6789 2
  • 如何使用 ggplot2 设置图例 alpha

    我有一张风速与方向的图表 其中有大量的点 因此除了 color month 之外 我还使用 alpha I 1 20 这是代码示例 library RMySQL library ggplot2 con lt dbConnect wind l
  • Jersey,如何 POST JSON 对象列表?

    我正在使用 Jersey 1 11 在 Java 中构建 RESTful Web 服务 并且在实现使用 JSON 化实体列表的方法时遇到问题 单实例方法工作正常 我得到的错误是 Status 400 Bad Request The requ
  • Android 中的 PEM 到 PublicKey

    我见过很多类似的问题 但没有一个对我有用 我只是想将从服务器检索到的 PEM 格式的 RSA 公钥转换为PublicKey在安卓中 有人能指出我正确的方向吗 编辑 我已成功使用以下代码将 PEM 转换为 PublicKey 但在对消息进行编
  • .csproj 的平台特定 ItemGroup 适用于程序集引用,但不适用于内容包含?

    由于我们有三个显式 x86 和 x64 版本的程序集 因此我编辑了相应的 csproj 文件以使用 例如 如下所示的块
  • 在 OpenGL-ES 2.0 中渲染多个 2D 图像

    我是 OpenGL 新手 正在尝试学习 ES 2 0 首先 我正在开发一款纸牌游戏 需要渲染多个纸牌图像 我跟着这个http www learnopengles com android lesson four introducing bas
  • Redux 框架在插件中使用时不工作

    我将使用 redux 框架作为我的插件选项 它显示在管理面板中 我可以保存设置 我使用了选项面板的示例配置文件 所以问题是我没有通过打印全局来获取选项值opt name多变的 如果我将 redux 框架配置文件添加到主题functions
  • CSS/HTML:在输入字段周围创建发光边框

    我想为我的表单创建一些像样的输入 并且我真的很想知道 TWITTER 如何在输入周围制作发光边框 Twitter 边框示例 图片 我也不太知道如何创建圆角 干得好 glowing border border 2px solid dadada
  • Eclipse:如何有选择地禁用某些注释中的拼写检查

    我使用的是 Eclipse Kepler 版本 如何禁用评论内的拼写检查 我确实看到 窗口 首选项 常规 编辑器 文本编辑器 拼写 但此表没有关于禁用注释内拼写检查的选项 理想情况下 我想禁用特定评论的拼写检查 在其他地方 拼写检查注释可能
  • 如何在 pygame 中进行二段跳?

    有人可以帮我调试我的代码吗 因为我不明白为什么我不能让我的角色用多个空格键进行双跳 当我运行脚本时 我可以向上 向下 向左 向右移动 但是一旦我按一次空格键 对象就会飞出窗口 问题出在这个 if 语句上 所以我猜测这个 if 语句会继续运行
  • 绑定 UserControl 依赖属性和 MVVM

    我有一个包含 UserControl 的 MainWindow 两者都以 MVVM 模式实现 MainWindowVM 具有我想要绑定到 UserControl1VM 中的属性的属性 但这行不通 这是一些代码 视图模型使用某种 mvvm 框
  • 将异步获取的数据传递给子 props

    我正在制作一个应用程序 它从远程源获取一系列新闻项目并将其显示在页面上 我有端点 并且可以使用控制台日志证明可以进行成功的调用 getJSON 我将此调用放入父组件中 因为子组件需要使用数据 但是 当我将此数据传递给子组件时 会出现控制台错
  • DataStorage 和查询未实现将 indexed=False 更改为 True

    在我的模型中 我有一个属性设置为indexed False 要在投影中使用它 我必须将其更改为indexed True 但令人惊讶的是 现在执行查询不会给出任何结果 始终为空 任何重新索引表的提示或为什么结果集为空 https develo
  • 如何正确配置QDockWidget使其显示/隐藏?

    我是 Qt GUI 的新手 最初想配置一个 Qt Dock 小部件 该小部件在按下某个键 假设为 A 时显示 并在按下另一个键 假设为 B 时隐藏 但经过一番研究 我没有找到任何相关的解决方案 我尝试创建一个切换按钮 第一次按下时将显示停靠