Qt обработка ключевых событий - PullRequest
1 голос
/ 08 марта 2011

Я пытаюсь написать консольный виджет для моей графической программы на C ++.Я делаю консольный виджет дочерним виджетом для виджета, выступающего в качестве основного окна.Консоль - это QDockWidget, который содержит QTextEdit. То, что я хочу сделать, это обработать события, когда клавиша Return нажата из ConsoleWidget, а затем обработать команду, все остальные события клавиш должны обрабатываться QTextEdit .Проблема в том, что я не могу перехватить какие-либо ключевые события, кроме таких, как клавиши Command и Shift ... Есть идеи?

Это код для консоли:

class ConsoleWidget : public QDockWidget
{
public:
    ConsoleWidget( const QString& sTitle, QWidget* pParent = 0, Qt::WindowFlags nFlags = 0 );
    ~ConsoleWidget();

protected:
    void keyPressEvent( QKeyEvent* pEvent );
    void keyReleaseEvent( QKeyEvent* pEvent );

private:
    QTextEdit* m_pTextArea;
};


ConsoleWidget::ConsoleWidget( const QString& sTitle, QWidget* pParent, Qt::WindowFlags nFlags ) :
        QDockWidget( sTitle, pParent, nFlags )
{
    setFocusPolicy( Qt::StrongFocus );
    m_pTextArea = new QTextEdit( this );
    setWidget( m_pTextArea );
}

ConsoleWidget::~ConsoleWidget()
{
    // Qt is taking ownership of pTextWidget... (I think)
}

void ConsoleWidget::keyPressEvent( QKeyEvent* pEvent )
{
    if( pEvent->key() & Qt::Key_Return )
    {
        int i = 666;
    }
    else
    {
        pEvent->setAccepted( false );
        // TODO Should I do this if not handling the event?
        //QDockWidget::keyPressEvent( pEvent );
    }
}

void ConsoleWidget::keyReleaseEvent( QKeyEvent* pEvent )
{
    QDockWidget::keyReleaseEvent( pEvent );
}

1 Ответ

3 голосов
/ 08 марта 2011

Вам нужно создать подкласс QTextEdit и переопределить там метод keyPressEvent. Помните, что класс QTextEdit будет потреблять большинство ключевых событий, поэтому они не будут передаваться до родительского виджета дока.

В качестве альтернативы вы можете установить фильтр событий. документы дают хороший пример. В вашем случае ваш пользовательский класс виджетов для закрепления может быть фильтром событий для QTextEdit, так что ваша логика находится в этом классе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...