- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个 QAction,我已经为它分配了多个快捷方式
test = new QAction();
this->addAction(test);
QList<QKeySequence> shortcuts;
shortcuts << QKeySequence(Qt::Key_N) << QKeySequence(Qt::Key_T);
test->setShortcuts(shortcuts);
connect(test,SIGNAL(triggered()),this,SLOT(SomeFucntion()))
在 SomeFucntion
中,我需要知道按下了哪个快捷方式....无论如何都知道吗?
最佳答案
您可以使用 QSignalMapper 尝试更精细的模式,避免定义尽可能多的操作,但需要 c++11(至少是这个实现)。
在窗口的构造函数中,使用以下代码声明您的QShortcut
对象和QSignalMapper
:
QSignalMapper* signalMapper = new QSignalMapper(this);
QShortcut* sc1 = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_N), this);
QShortcut* sc2 = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_T), this);
connect(sc1, &QShortcut::activated, signalMapper, static_cast<void (QSignalMapper::*)(void)>(&QSignalMapper::map));
connect(sc2, &QShortcut::activated, signalMapper, static_cast<void (QSignalMapper::*)(void)>(&QSignalMapper::map));
signalMapper->setMapping(sc1, sc1);
signalMapper->setMapping(sc2, sc2);
QAction* action = new QAction();
connect(signalMapper, static_cast<void (QSignalMapper::*)(QObject*)>(&QSignalMapper::mapped),
[action](QObject *object){
QShortcut* sc = qobject_cast<QShortcut*>(object);
if (sc)
{
action->setData(sc->key().toString());
action->trigger();
}
});
connect(action, &QAction::triggered, this, &MainWindow::doStuff);
由于 QSignalMapper 的工作方式,第三个连接是必需的:当快捷方式被激活时,由于第一个和第二个连接,它将被通知到 QSignalMapper,这将触发 map() 槽。
QSignalMapper::map() 槽将扫描其映射,由 setMapping() API 生成,其第一个参数是映射对象,第二个参数是将用于发出 mapped() 槽的参数QSignalMapper 的,一旦发射对象被识别。为此,它使用 sender() 方法并将返回的指针与您作为映射提供的映射 QObject 指针进行简单比较。
一旦 QObject 被识别,QSignalMapper 将发出 QSignalMapper::mapped(QObject*) 信号,其参数是给 setMapping 的第二个参数,在这种情况下它与第一个相同,也是一个指针到已激活的 QShortcut。
我使用了一个 lambda 来捕捉这个信号,在这个 lambda 中我简单地检查给定的参数是一个 QShortcut 指针,并将它的键序列存储在 QAction 的数据成员中 before行动本身。然后 QAction::trigger() 插槽将发出 QAction::triggered() 信号,该信号将依次调用您的自定义插槽,在本例中为 doStuff()。您可以在那里检索键序列并用它做您想做的事。
因此您的插槽实现应该与此类似:
void MainWindow::doStuff()
{
// use sender() to fetch data from action
QAction* act = qobject_cast<QAction*>(sender());
if (act)
{
QString sequence = act->data().toString();
// debug output will show you the triggering key sequence
qDebug() << sequence;
// use sequence string to determine which shortcut was used
// On Mike hint: better to reset data after use :)
act.setData(QVariant());
}
}
请注意,我使用的是基于 QObject 指针的映射。通过这种方式,您可以重用 signalMapper
实例来连接来自其他类型的 QObject(例如 QPushButtons)的事件,并在您的自定义插槽中识别它们,并为 QAction 数据成员设置适当的值,该值可以存储一个通用的 QVariant 实例。
另外,在使用 QShortcut 时,请注意它们的 contex ,即它们处于事件状态时,因为它可能在小部件或窗口范围内。
不幸的是,这种模式违反了纯粹的 oop 原则,但可能比出于同一目的管理许多操作(图标、文本、工具提示等)要好。
编辑:回答评论
首先,让我澄清一下,您当然可以完全跳过 QSignalMapper 的使用。这只是一个可能的解决方案(不是更好,也许是矫枉过正......但在性能方面并不是真的更差)。
正如 Mike 在评论中指出的,一种更简单的方法是对每个 QShotcut::activated 信号使用 lambda,但这会导致复制/粘贴代码,我总是尽量避免这种情况。您可以改为在 MainWindow 中定义一个自定义插槽,并使用 sender() 来捕获 QShortcut 并在触发它之前准备操作。
无论如何,恕我直言,QSignalMapper 更好地解释了您在做什么(从语义的角度来看)并且在您需要扩展与其他 QObject 的连接时更加灵活,还支持其他类型的映射。
此外,但这与我的个人品味有关,我喜欢将逻辑上相关的代码片段压缩成小片段的想法,而不是将它们分散在多个插槽/函数中,因为这样更容易阅读和理解在我需要更改它时进行追溯,当然前提是这不会损害代码本身的质量。
关于c++ - 确定在 Qt 中按下了哪个快捷方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50720742/
我正在使用 Selenium Web 驱动程序 3.0,并且想要从打开的两个对话框(一个在后台,第二个在前台)的 Activity 对话框中单击“确定”按钮。如何从 html 下面的父 div 单击前
actions: [ FlatButton( onPressed: () {
我有一个问题有点超出我的范围(我真的很高兴我是 Beta)涉及重复项(所以 GROUP BY, HAVING, COUNT),通过将解决方案保留在 SQLite 附带的标准函数中而变得更加复杂。我正在
使用DBI是否可以确定SELECT语句的已执行语句句柄是否返回任何行而不从中获取行? IE。就像是: use DBI; ... my $sth = $dbh->prepare("SELECT ..."
是否可以为“确定”和“关闭”按钮指定回调函数? 如果是JQuery Modal,则可以在初始化时使用按钮字典指定回调函数。 Semantic-ui模态是否提供类似的功能?按下确定后,我该如何寻求其他逻
我想阅读警报中的消息。 示例:如果警报显示“错误的电子邮件地址”。怎么读呢?意味着我想将该消息存储在字符串中。 如何在“警报”中单击“确定”...?? 如何使用 Selenium 来做到这一点? 最佳
我有一个删除按钮: 我试图首先查明是否已选择一个网站,如果已选择一个网站,我需要确定是否已选择一个或多个列表项,如果是,则继续删除这些项目。 我的 if 语句不断返回“您必须首先选择您的列表”,即使它
部分出于好奇——我们想知道在我们的应用程序中发生了什么——部分是因为我们需要在我们的代码中找到一些潜在的问题,我喜欢在我们的网络应用程序运行时跟踪一些一般值。这尤其包括某些对象图的分配内存。 我们的应
我将 SweetAlert 与 Symfony 结合使用,我希望用户在完成删除操作之前进行确认。 发生的情况是,当用户单击删除按钮时,SweetAlert 会弹出,然后立即消失,并且该项目被删除。 在
我们有一个应用程序可以生成不包括字母 O 的随机基数 35 [0-9A-Z]。我正在寻找一种解决方案来查找包含任何淫秽英语单词的代码,而无需搜索包含 10,000 个条目的列表每个生成的代码。每秒生成
这是我做的: #include #include int betweenArray(int a, int b){ int *arr,i,range; range = b - a +
我知道如何创建 警报和确认框,但我不知道如何做的是实际单击“确定”。我有一个弹出确认框的页面。 我想使用 Java Script 插件单击“确定”。基本上,我希望我的代码单击页面上的链接,然后在出现提
代码: swal('Your ORDER has been placed Successfully!!!'); window.location="index.php"; 甜蜜警报工
>>> import re >>> s = "These are the words in a sentence" >>> regex = re.compile('are|words') >>> [m
使用确定的理想散列函数给出随机期望线性时间算法两个数组 A[1..n] 和 B[1..n] 是否不相交,即 A 的元素是否也是 B 的元素。 谁能告诉我如何做到这一点,甚至如何开始考虑它? 最佳答案
我在计算机科学课上有这段代码: int input=15; while (input < n ) { input = input *3;} 这段代码有 log3(n/15) 次循环的上限。我们怎样才能
我有一个允许 2 位玩家玩 TicTacToe 的程序。在每个玩家移动之后,它应该在那个点显示棋盘并返回一个名为 Status 的枚举,显示玩家是否应该继续,如果玩家赢了,还是平局。但是,该算法要么返
给定一个 y 值数组,例如 [-3400, -1000, 500, 1200, 3790],我如何确定“好的”Y 轴标签并将它们放置在网格上? ^ ---(6,000)-|---
假设我有一个检查用户登录的 SQL 语句: SELECT * FROM users WHERE username='test@example.com', password='abc123', expi
teradata中有返回表中哪一列被定义为主索引的命令吗?我没有制作一些我正在处理的表,也没有尝试优化我对这些表的连接。谢谢! 最佳答案 有dbc.IndicesV,其中IndexNumber=1表示
我是一名优秀的程序员,十分优秀!