• 5224阅读
  • 6回复

[提问]如何解决一个控件内多个快捷键同时触发的问题? [复制链接]

上一主题 下一主题
离线cwfriend
 
只看楼主 倒序阅读 楼主  发表于: 2012-02-16
举个例子:
QWidget *w = new QWidget;
//button1
QPushButton *b1 = new QPushButton(w);
connect(b1, SIGNAL(clicked()), w, SLOT(deleteLater());
b->setShortcut(QKeySequence(Qt::Key_1));  
//button2
QPushButton *b2 = new QPushButton(w);
connect(b2 , SIGNAL(clicked()), w, SLOT(deleteLater());
b->setShortcut(QKeySequence(Qt::Key_2));

当我同时按下1和2键的时候都会响应,我希望不响应或只响应一个,这显然不是我要的效果。向大家请教,如何才能解决这个问题?
离线xuweistudy
只看该作者 1楼 发表于: 2012-02-16
你可以同时按下1和2吗,呵呵,肯定有先后顺序,只有复合键才可以啊 呵呵
离线jdwx

只看该作者 2楼 发表于: 2012-02-16
键盘也不会让你同时按下1和2两个键。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线cwfriend
只看该作者 3楼 发表于: 2012-02-16
好吧,那我改成这样比较典型:
QWidget *w = new QWidget;
//button1
QPushButton *b1 = new QPushButton(w);
connect(b1, SIGNAL(clicked()), w, SLOT(close());
b->setShortcut(QKeySequence(Qt::Key_1));  
//button2
QPushButton *b2 = new QPushButton(w);
connect(b2 , SIGNAL(clicked()), w, SLOT(deleteLater());
b->setShortcut(QKeySequence(Qt::Key_2));

我说的同时是操作角度上的同时,人为的同时。这时候两个slot都会触发,而且可以同时看到两个按钮被按下的动作,然后两个槽都会被执行。你可以试试连接b2的槽改为能打开一个QMessageBox,这时候你有可能看到窗口已经关闭,但是QMessageBox却挂在那里,这显然是很奇怪的。
离线cwfriend
只看该作者 4楼 发表于: 2012-02-16
我最希望的结果是按下1和2时,它们被视为组合键,既不会触发b1也不会触发b2
离线jdwx

只看该作者 5楼 发表于: 2012-02-16
回 4楼(cwfriend) 的帖子
如果是,将1和2做组合键像Ctrl+O那样的,那是不可能的,键盘不会发出按键信息。
要是先按1再按2,自己写一个按键处理函数keyPressEvent,延时处理按键事件。
还有不要用:b->setShortcut(QKeySequence(Qt::Key_2));,否则按下2键就会动作。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线cwfriend
只看该作者 6楼 发表于: 2012-02-19
回 5楼(jdwx) 的帖子
这个问题自己解决了,pressed()信号+shortcut使用就没有这个问题了。shortcut是激发了click槽,在clicked()信号在发生前有一小段时间,这段时间本来就是可以有用户输入的。另外还可以加一些状态来互斥多个shortcut对应的槽,虽然麻烦一点,但这样就可以使用clicked信号了
快速回复
限100 字节
 
上一个 下一个