qml熟悉了个大概,打算输入文字和后台交互的时候发现默认的英文输入法切换不了中文输入法了,因为我把win10系统的输入法设置为默认英文,其他程序输入框中按shift即可切换输入法,但是我写的qt程序就不行,对比了一下其他可以输入中文的qt程序,发现是qml文件引用方式的问题
我写的qml文件是用QQuickWidget设置source引用的
mainWindow::mainWindow(QWidget *parent)
: QWidget(parent)
{
m_contentView = new QQuickWidget();
m_contentView->setSource(QUrl("qrc:///Qml/mainWindow.qml")); //设置对应的qml文件
// qml对应的widget添加到本窗口
QVBoxLayout *layout = new QVBoxLayout;
layout->setContentsMargins(0, 0, 0, 0);
layout->setSpacing(0);
layout->addWidget(m_contentView);
setLayout(layout);
}
改成
mainWindow::mainWindow(QWidget *parent)
: QWidget(parent)
{
this->resize(1000, 600);
m_contentView = new QQuickView();
m_contentView->setSource(QUrl("qrc:///Qml/mainWindow.qml"));
QWidget *pViewContainer = this->createWindowContainer(m_contentView, this);
pViewContainer->resize(size());
}
mainWindow继承自QWidget,可以不用改,但是QQuickView需要手动delete,不然点击关闭按钮后,程序会阻塞住。
然后mainWindow.qml中的TextField控件就可以直接按shift输入中文了
如果依然想使用QQuickWidget,则需要继承QQuickWidget,
class tempWidget:public QQuickWidget{
Q_OBJECT
public:
using Supper = QQuickWidget;
tempWidget();
public slots:
void onActiveFocusItemChanged();
};
cpp文件
tempWidget::tempWidget(){
connect(quickWindow(), &QQuickWindow::activeFocusItemChanged, this, &tempWidget::onActiveFocusItemChanged);
}
void tempWidget::onActiveFocusItemChanged(){
QQuickItem *pFocusItem = quickWindow()->activeFocusItem();
if (pFocusItem && pFocusItem->inherits("QQuickTextInput")){
disconnect(quickWindow(), &QQuickWindow::activeFocusItemChanged, this, &tempWidget::onActiveFocusItemChanged);
clearFocus();
pFocusItem->forceActiveFocus();
}
}
具体原因不知道,只记得google的时候看到过这个解决方案