Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Ctrl+;从Qt4移植到Qt5时U键组合丢失_C++_Qt_Qt4 - Fatal编程技术网

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

C++ Ctrl+;从Qt4移植到Qt5时U键组合丢失,c++,qt,qt4,C++,Qt,Qt4,我正在将一个程序从Qt4移植到Qt5。我把它编译成两个版本。除了在两种不同的情况下丢失了Qt5版本中的Ctrl+U键盘快捷键外,新版本中几乎所有功能都正常工作: 在对话框中,使用分配给Ctrl+U键序列的QShortcut 在主窗口中,在事件筛选器中侦听evens时 这似乎特定于Ctrl+U。我知道,在对话框中,其他快捷方式,如Ctrl+F或Ctrl+W与以前一样工作,在主窗口中,Ctrl+P也与以前一样工作 Qt5中的Ctrl+U(可能还有其他)是否有什么特殊之处阻止我观看该活动 编辑 它

我正在将一个程序从Qt4移植到Qt5。我把它编译成两个版本。除了在两种不同的情况下丢失了Qt5版本中的
Ctrl+U
键盘快捷键外,新版本中几乎所有功能都正常工作:

  • 在对话框中,使用分配给
    Ctrl+U
    键序列的
    QShortcut
  • 在主窗口中,在事件筛选器中侦听evens时
这似乎特定于
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();
}

点击
Ctrl+T
会在状态栏中显示测试,但
Ctrl+U
不会。注释掉
setCentralWidget(le)
行将恢复预期的行为。

我找不到问题的根源,尤其是因为
Ctrl+U
在中未被引用为键盘快捷键。然而,我发现了一个很好的解决方法,灵感来自。我在自己的
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);
  }
bool通知(QObject*接收器,QEvent*事件)
{
//我们覆盖QLineEdit中的键盘快捷键
如果(事件->类型()==QEvent::ShortcutOverride&&
动态广播(接收机)){
事件->忽略();
返回false;
}
返回QApplication::notify(接收者、事件);
}

我找不到问题的根源,特别是因为在中,
Ctrl+U
没有被作为键盘快捷键引用。然而,我发现了一个很好的解决方法,灵感来自。我在自己的
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);
  }
bool通知(QObject*接收器,QEvent*事件)
{
//我们覆盖QLineEdit中的键盘快捷键
如果(事件->类型()==QEvent::ShortcutOverride&&
动态广播(接收机)){
事件->忽略();
返回false;
}
返回QApplication::notify(接收者、事件);
}

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