自定义小部件中的Qt和死键
Qt and dead keys in a custom widget
问题
我无法使死键在我的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-8
、utf-8
、UTF8
和utf8
)在构造函数中具有和不具有CCD_ 7。
没有人改变我可观察到的行为。
搜索网页主要(仅?)与系统相关的问题。如上所述,我已经尝试了所提出的解决方案,但这并不能解决我的问题,而且我尝试过的其他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();
}
但我的答案是不完整的:
我不确定这是否真的足够,即使是
我确信这对于更复杂的写作系统来说是不够的,而且我缺乏理解我找到的文档的先决条件。
相关文章:
- 由于PC显示设置的更改,Qt小部件被部分剪裁
- 有没有办法区分Qt小部件是通过鼠标单击还是通过按表键获得焦点?
- 在Qt小部件应用程序中,在重载的"paintEvent"中的"setValue"
- Qt小部件中的摄像头访问
- 精灵动画查看器应该使用哪些Qt小部件
- Qt小部件将子布局堆叠在彼此之上
- 将STL文件添加到QT小部件
- Qt小部件应用程序"Library not registered"错误
- 为什么我的Qt小部件的焦点被改变了?
- 如何将开关QML添加到QT小部件
- 从另一个线程更新QT小部件的一种详细方法
- QT小部件应用程序输出到控制台
- 在屏幕上的确切位置保存和恢复Qt小部件
- 在Qt小部件应用程序中显示cmd终端
- QSqlError("',"',"',) 在 QT 小部件应用程序中
- 处理自定义QT小部件中的输入事件
- 未找到"png.h"文件,当包含在Qt小部件项目中时
- 从 Qt 小部件应用程序调用 pyqt widget
- 当您通过Qt小部件打开文件时,是否可以'pop-up'文件?
- 如何在Qt小部件应用程序中翻译外部文件中的字符串?