gpt4 book ai didi

c++ - 自定义小部件中的 Qt 和死键

转载 作者:太空狗 更新时间:2023-10-29 23:02:22 25 4
gpt4 key购买 nike

问题

我无法让死键在我的 Qt 程序中工作,而在同一系统上 Qt 应用程序(例如 konsole 或 kmail)正在正确处理它们。

如何重现

测试用例.pro

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

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

测试用例.hpp

#include <QWidget>

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

测试用例.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。

  • 取消设置 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;

要处理dead keys和compose,好像有就够了

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. 我确信这对于更复杂的书写系统来说还不够,而且我缺乏理解我找到的文档的先决条件。

关于c++ - 自定义小部件中的 Qt 和死键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28793356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com