2017-02-08 2 views
1

Я в процессе портирования программы с Qt4 на Qt5. Я получил это до такой степени, что он компилируется с обеих версий. Почти все, кажется, работает в новой версии, за исключением, что я потерял ярлык Ctrl+U клавиатуры в версии Qt5 в двух различных контекстах:Комбинация клавиш Ctrl + U теряется при портировании с Qt4 на Qt5

  • в диалоговом окне, используя QShortcut назначен на ключевой последовательности Ctrl+U
  • в главном окне, при прослушивании эвенов в фильтре событий.

Это похоже на Ctrl+U. Я знаю, что в диалоговом окне другие ярлыки вроде Ctrl+F или Ctrl+W работают так, как раньше, а в главном окне Ctrl+P работает как и раньше.

Есть ли что-нибудь особенное о Ctrl+U (и, возможно, других) в Qt5, которые мешают мне увидеть событие?

Редактировать

Кажется, что это связано с наличием линии редактирования. 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

ли вы получаете какие-либо сообщения в журнале, что говорит ярлык определяется несколько раз? Если это произойдет, ярлык отключен вообще; ни место, где оно назначено, не будет работать. – goug

+0

@goug Нет, у меня их нет. Более того, в одном из двух случаев я не использую ярлык, просто перехватывая события. –

+0

Похоже, что что-то выше, перехватывая Ctrl-U, прежде чем оно попадет в ваше приложение или в ваш диалог. Является ли Ctrl-U ярлыком в системном меню диалога или что-то в этом роде? (Вы еще не сказали, на какой платформе вы работаете.) Вы запускаете как версию Qt4, так и версию Qt5 в том же поле, но получаете эти разные результаты? – goug

ответ

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); 
    } 
Смежные вопросы