从 Qt4 移植到 Qt5 时 Ctrl+U 组合键丢失

Posted

技术标签:

【中文标题】从 Qt4 移植到 Qt5 时 Ctrl+U 组合键丢失【英文标题】:Ctrl+U key combination lost when porting from Qt4 to Qt5 【发布时间】:2017-02-08 23:59:09 【问题描述】:

我正在将程序从 Qt4 移植到 Qt5。我得到了它与两个版本一起编译的地步。几乎所有东西在新版本中都可以正常工作,除了我在两个不同的上下文中丢失了 Qt5 版本中的Ctrl+U 键盘快捷键:

在对话框中,使用分配给Ctrl+U 按键序列的QShortcut 在主窗口中,在事件过滤器中侦听事件时。

这似乎是 Ctrl+U 特有的。我知道在对话框中,Ctrl+FCtrl+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) 行会恢复预期的行为。

【问题讨论】:

您是否收到任何日志消息表明快捷方式已定义多次?如果发生这种情况,快捷方式将被完全禁用;分配它的地方都不行。 @goug 不,我没有这些。此外,在这两种情况之一中,我没有使用快捷方式,只是拦截事件。 听起来更高层的东西在 Ctrl-U 到达您的应用程序或对话框之前拦截它。 Ctrl-U 是对话框系统菜单上的快捷方式,还是类似的东西? (你还没有说你在哪个平台上。)你是否在同一个盒子上同时运行 Qt4 版本和 Qt5 版本,但得到这些不同的结果? @goug 平台是 Linux;两个版本都在完全相同的环境中运行。 【参考方案1】:

我找不到问题的根源,特别是因为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);
  

【讨论】:

以上是关于从 Qt4 移植到 Qt5 时 Ctrl+U 组合键丢失的主要内容,如果未能解决你的问题,请参考以下文章

将 Qt5 应用程序反向移植到 Qt4 时替换 Q_NULLPTR?

Qt5 (Linux/LXDE) 中不显示系统托盘图标

测试从 qt4 迁移到 qt5 的库时出现分段错误

qt4升级到qt5的一些问题

Qt5.8.0纯代码编写HelloWorld程序

Qt5.8.0纯代码编写HelloWorld程序