0

我试图在我的 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 应用程序的多个位置使用虚拟键盘?

4

0 回答 0