Qt问题之 告别软件因系统默认中文输入法导致错误退出的烦恼 ...

打印 上一主题 下一主题

主题 1672|帖子 1672|积分 5016

1. 问题

利用Qt进行研发时,遇到一个问题,当在系统默认输入法中文(英文输入法或者搜狗就不会触发闪退)的情况下,选中QTableWidget控件(QTableWidgetItem有核心,但是不双击), 进行输入,会导致软件错误退出。
这个Bug在Qt的Bug记录里也存在:QTableWidgetItem cause stack overflow

2. 问题复现

输入以下代码,按照问题操作步骤,可复现问题。
  1.     ui->tableWidget->setCellWidget(0, 1, new QLineEdit);
复制代码

3. 解决方案1 设置输入方式,紧急解决方案

  1. ui->tableWidget->setInputMethodHints(Qt::ImhHiddenText);
复制代码
4. 解决方案2 每个设置Item的地方利用setCellWidget,非最优解

  1.     for (int i = 0; i < ui->tableWidget->rowCount(); ++i)
  2.     {
  3.         for (int j = 0; j < ui->tableWidget->columnCount(); ++j)
  4.         {
  5.             ui->tableWidget->setCellWidget(i, j, new QLineEdit);
  6.         }
  7.     }
复制代码
5. 解决方案3 利用代理,首选建议

示例代码
.h
  1. // 自定义代理类,继承自 QStyledItemDelegate
  2. class SpinBoxDelegate : public QStyledItemDelegate
  3. {
  4.     Q_OBJECT
  5. public:
  6.     SpinBoxDelegate(QObject *parent = nullptr) : QStyledItemDelegate(parent) {}
  7.     // 创建编辑器,当用户开始编辑单元格时调用
  8.     QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
  9.                           const QModelIndex &index) const override
  10.     {
  11.         QSpinBox *editor = new QSpinBox(parent);
  12.         editor->setMinimum(0);
  13.         editor->setMaximum(100);
  14.         return editor;
  15.     }
  16.     // 设置编辑器的数据,将模型中的数据设置到编辑器中
  17.     void setEditorData(QWidget *editor, const QModelIndex &index) const override
  18.     {
  19.         int value = index.model()->data(index, Qt::EditRole).toInt();
  20.         QSpinBox *spinBox = static_cast<QSpinBox*>(editor);
  21.         spinBox->setValue(value);
  22.     }
  23.     // 将编辑器中的数据保存到模型中
  24.     void setModelData(QWidget *editor, QAbstractItemModel *model,
  25.                       const QModelIndex &index) const override
  26.     {
  27.         QSpinBox *spinBox = static_cast<QSpinBox*>(editor);
  28.         int value = spinBox->value();
  29.         model->setData(index, value, Qt::EditRole);
  30.     }
  31.     // 更新编辑器的几何形状,确保编辑器显示在正确位置
  32.     void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option,
  33.                               const QModelIndex &index) const override
  34.     {
  35.         editor->setGeometry(option.rect);
  36.         QStyledItemDelegate::updateEditorGeometry(editor, option, index);
  37.     }
  38. };
复制代码
调用:
  1. #include <QtWidgets>
  2. int main(int argc, char *argv[])
  3. {
  4.     QApplication app(argc, argv);
  5.     // 创建一个表格视图
  6.     QTableView tableView;
  7.     // 创建一个标准的表格数据模型
  8.     QStandardItemModel model(4, 2);
  9.     model.setHeaderData(0, Qt::Horizontal, "Integer");
  10.     model.setHeaderData(1, Qt::Horizontal, "Square");
  11.     // 为表格设置数据模型
  12.     tableView.setModel(&model);
  13.     // 创建一个自定义代理实例
  14.     SpinBoxDelegate delegate;
  15.     // 将代理应用到第一列
  16.     tableView.setItemDelegateForColumn(0, &delegate);
  17.     // 填充表格数据
  18.     for (int row = 0; row < 4; ++row) {
  19.         for (int column = 0; column < 2; ++column) {
  20.             QModelIndex index = model.index(row, column);
  21.             if (column == 0) {
  22.                 model.setData(index, row);
  23.             } else {
  24.                 int value = row * row;
  25.                 model.setData(index, value);
  26.             }
  27.         }
  28.     }
  29.     tableView.show();
  30.     return app.exec();
  31. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大连密封材料

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表