簡體   English   中英

自定義小部件中的Qt和死鍵

[英]Qt and dead keys in a custom widget

問題

我無法在我的Qt程序中使用死鍵,而在同一系統上,Qt應用程序(例如konsole或kmail)正確處理它們。

如何重現

testcase.pro

TEMPLATE = app
TARGET = testcase
INCLUDEPATH += .
QT += core widgets gui

HEADERS += testcase.hpp
SOURCES += testcase.cpp

testcase.hpp

#include <QWidget>

class TestWindow: public QWidget
{
    Q_OBJECT
public:
    TestWindow(QWidget* parent=0, Qt::WindowFlags flags=0);
    void keyPressEvent(QKeyEvent* event);
};

testcase.cpp

#include <QApplication>
#include <QDebug>
#include <QWidget>
#include <QKeyEvent>

#include "testcase.hpp"

TestWindow::TestWindow(QWidget* parent, Qt::WindowFlags flags)
        : QWidget(parent, flags)
{
    setAttribute(Qt::WA_KeyCompression);
}

void TestWindow::keyPressEvent(QKeyEvent* event)
{
    qDebug() << event;
}

int main(int argc, char** argv)
{
    QApplication app(argc, argv);

    TestWindow mainWin;
    mainWin.show();

    return app.exec();
}

編譯上面的程序(qmake; make),啟動它。 死鍵給出了例如:

QKeyEvent(KeyPress, 1001252, 0, ""^"", false, 1) 
QKeyEvent(KeyPress, 45, 0, ""e"", false, 1) 

我在期待

QKeyEvent(KeyPress, 234, 0, ""ê"", false, 1) 

這也是可以接受的:

QKeyEvent(KeyPress, 1001252, 0, ""^"", false, 1) 
QKeyEvent(KeyPress, 234, 0, ""ê"", false, 1) 

我試過的

我正在使用帶有語言環境fr_FR.UTF-8的Ubuntu 14.10系統

我試過了

  • 系統提供的Qt 5.3.0和Qt 4.8.6。

  • unseting XMODIFIERS (默認值為@im=ibus被某些人報告為問題)

  • 更改區域設置(再次,谷歌查找報告是點后的部分是一個問題,我嘗試了4種變體UTF-8utf-8UTF8utf8

  • 有和沒有setAttribute(Qt::WA_KeyCompression); 在構造函數中。

沒有改變我的可觀察行為。

搜索網絡主要(僅?)系統相關問題。 如上所述,我嘗試了所提出的解決方案,但這並沒有解決我的問題以及我嘗試過的其他Qt應用程序能夠處理死鍵的事實讓我覺得我錯過了我的代碼中的某些內容,尤其是一個稍微復雜的例子,我可以使用Qt提供的小部件的死鍵(例如QLineEdit)。

這是一個部分答案,但是沒有人回答這對以后的人有用。

死鍵由輸入方法處理,輸入方法也處理組合鍵以及輸入漢字和其他字符的方式。

小部件必須表示它處理輸入方法:

setAttribute(Qt::WA_InputMethodEnabled, true);

然后它必須覆蓋兩個虛擬成員:

void inputMethodEvent(QInputMethodEvent*);
QVariant inputMethodQuery(Qt::InputMethodQuery) const;

為了處理死鍵和組合,似乎已經足夠了

void TestWindow::inputMethodEvent(QInputMethodEvent* event)
{
    if (!event->commitString().isEmpty()) {
        QKeyEvent keyEvent(QEvent::KeyPress, 0, Qt::NoModifier,
                           event->commitString());
        keyPressEvent(&keyEvent);
    }
    event->accept();
}

QVariant TestWindow::inputMethodQuery(Qt::InputMethodQuery) const
{
    return QVariant();
}

但那是我的答案是不完整的:

  1. 即便如此,我也不確定它是否足夠

  2. 我確信這對於更復雜的書寫系統是不夠的,我缺乏理解我發現的文檔的先決條件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM