从Qt4移植到Qt5时Ctrl + U组合键丢失
问题描述:
我正在将程序从Qt4移植到Qt5。我已经达到了编译这两个版本的程度。几乎一切似乎都在新版本中的工作,除外,我已经失去了在QT5版本Ctrl+U
键盘快捷键在两个不同的上下文:在对话框中从Qt4移植到Qt5时Ctrl + U组合键丢失
- ,使用分配给
Ctrl+U
键序列QShortcut
当在事件过滤器中侦听事件时,在主窗口中输入
- 。
这似乎特定于Ctrl+U
。我知道在对话框中,其他快捷方式(如Ctrl+F
或Ctrl+W
)与以前一样工作,而在主窗口中,Ctrl+P
也可以像以前一样工作。
Qt5中有什么特别的Ctrl+U
(可能还有其他的)阻止我看到该事件?
编辑
似乎它与一个行编辑的存在。 MWE:
#include "mw.hh"
#include <QApplication>
#include <QShortcut>
#include <QStatusBar>
#include <QKeySequence>
#include <QTextStream>
#include <QLineEdit>
static void registerShortCut(const QKeySequence & seq, QWidget * receiver,
const char * fn,
Qt::ShortcutContext context = Qt::WindowShortcut)
{
QShortcut * sc = new QShortcut(seq, receiver);
sc->setContext(context);
receiver->connect(sc, SIGNAL(activated()), fn);
}
MW::MW()
{
statusBar()->showMessage("stuff");
registerShortCut(QKeySequence(tr("Ctrl+T")),
this, SLOT(test()));
registerShortCut(QKeySequence(tr("Ctrl+U")),
this, SLOT(test2()));
QLineEdit * le = new QLineEdit("stuff");
setCentralWidget(le);
}
void MW::test()
{
statusBar()->showMessage("Test !");
}
void MW::test2()
{
statusBar()->showMessage("Test 2 !");
}
int main(int argc, char ** argv)
{
QApplication main(argc, argv);
MW mw;
mw.show();
main.exec();
}
随着mw.hh
:
#include <QMainWindow>
class MW : public QMainWindow {
Q_OBJECT;
public:
MW();
public slots:
void test();
void test2();
};
击中Ctrl+T
测试显示在状态栏,但Ctrl+U
没有。注释掉setCentralWidget(le)
行可恢复预期行为。
答
我无法找到问题的根源,尤其是因为Ctrl+U
未被引用为QLineEdit中的键盘快捷键。不过,我发现了一个很好的解决方法,灵感来自this answer。我下面的代码添加到我自己的QApplication
子类:
bool notify(QObject * receiver, QEvent * event)
{
// We override keyboard shortcuts within QLineEdit
if(event->type() == QEvent::ShortcutOverride &&
dynamic_cast<QLineEdit*>(receiver)) {
event->ignore();
return false;
}
return QApplication::notify(receiver, event);
}
你明白,说的快捷方式被定义多次任何日志消息?如果发生这种情况,快捷方式将被禁用。既不分配它的地方也可以工作。 – goug
@goug不,我没有这些。而且,在两种情况中的一种情况下,我没有使用快捷方式,只是拦截事件。 –
听起来好像是在Ctrl-U到达应用程序或对话框之前拦截了Ctrl-U。 Ctrl-U是对话框系统菜单上的一个快捷方式,还是沿着这些方向? (你还没有说过你在使用什么平台。)你是否在同一个盒子上同时运行Qt4版本和Qt5版本,但获得这些不同的结果? – goug