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

时间:2017-02-08 23:59:09

标签: c++ qt qt4

我正在将程序从Qt4移植到Qt5。我得到了它与两个版本编译的程度。几乎所有内容似乎都适用于新版本,不过我在两个不同的上下文中丢失了Qt5版本中的Ctrl+U键盘快捷键:

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

这似乎特定于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)行会恢复预期的行为。

1 个答案:

答案 0 :(得分:0)

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