我试图在我的 qt 应用程序的多个对话框 A 和 B 中显示一个虚拟键盘。目前,当我在 B 之前打开对话框 A 时,我的应用程序会崩溃,但反之则不会。
每次单击主 UI 中的按钮时,都会再次创建对话框 A,如下所示:
void MainUI::on_theButton_clicked()
{
QDialog newDialog(this);
QVBoxLayout *vLayout = new QVBoxLayout;
QSpinBox *spinBox = new QSpinBox;
spinBox->setRange(0, 100);
QLabel *spinBoxLabel = new QLabel(tr("Spin Box Label: "));
QFormLayout *labelBoxLayout = new QFormLayout;
labelBoxLayout->addRow(spinBoxLabel, spinBox);
QQuickWidget *keyboard = new QQuickWidget(QUrl::fromLocalFile(QString::fromStdString("/path/to/virtualKeyboard.qml");
keyboard->setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding));
keyboard->setResizeMode(QQuickWidget::SizeRootObjectToView);
keyboard->setFocusPolicy(Qt::NoFocus); // otherwise input widget loses focus, when trying to use keyboard
QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
vLayout->addLayout(labelBoxLayout);
vLayout->addWidget(keyboard);
vLayout->addWidget(buttonBox);
newDialog.setLayout(vLayout);
connect(buttonBox, &QDialogButtonBox::accepted, &newDialog, &QDialog::accept);
connect(buttonBox, &QDialogButtonBox::rejected, &newDialog, &QDialog::reject);
int ret = newDialog.exec();
switch (ret) {
case QDialog::Accepted:
{
// do your work...
break;
}
case QDialog::Rejected:
// No was clicked
break;
default:
// should never be reached
break;
}
}
VirtualKeyboard.qml 的内容如下所示:
import QtQuick 2.12
import QtQuick.VirtualKeyboard 2.1
Item {
id: root
InputPanel {
id: inputPanel
anchors.left: parent.left
anchors.right: parent.right
}
}
对话框 B 使用带有 QQuickWidget 的 UI 文件,也用于键盘。QQuickWidget 的源在 B 的构造函数中设置,B 是 MainUI 的成员。
我怀疑一个是打算在整个应用程序中使用一个虚拟键盘作为单例。但是,当我尝试在 MainUI 中为键盘创建一个 QQuickWidget 时,将其保留为成员并在 Dialog A 中使用它时调用addWidget
键盘我会在打开 A 两次时崩溃。如何在 Qt 应用程序的多个位置使用虚拟键盘?