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

1. 问题

使用Qt进行研发时,遇到一个问题,当在系统默认输入法中文(英文输入法或者搜狗就不会触发闪退)的情况下,选中QTableWidget控件(QTableWidgetItem有焦点,但是不双击), 进行输入,会导致软件错误退出。

这个Bug在Qt的Bug记录里也存在:QTableWidgetItem cause stack overflow

2. 问题复现

输入以下代码,按照问题操作步骤,可复现问题。

cpp 复制代码
    ui->tableWidget->setCellWidget(0, 1, new QLineEdit);

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

cpp 复制代码
ui->tableWidget->setInputMethodHints(Qt::ImhHiddenText);

4. 解决方案2 每个设置Item的地方使用setCellWidget,非最优解

cpp 复制代码
    for (int i = 0; i < ui->tableWidget->rowCount(); ++i)
    {
        for (int j = 0; j < ui->tableWidget->columnCount(); ++j)
        {
            ui->tableWidget->setCellWidget(i, j, new QLineEdit);
        }
    }

5. 解决方案3 使用代理,首选建议

示例代码
.h

cpp 复制代码
// 自定义代理类,继承自 QStyledItemDelegate
class SpinBoxDelegate : public QStyledItemDelegate
{
    Q_OBJECT
public:
    SpinBoxDelegate(QObject *parent = nullptr) : QStyledItemDelegate(parent) {}

    // 创建编辑器,当用户开始编辑单元格时调用
    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
                          const QModelIndex &index) const override
    {
        QSpinBox *editor = new QSpinBox(parent);
        editor->setMinimum(0);
        editor->setMaximum(100);
        return editor;
    }

    // 设置编辑器的数据,将模型中的数据设置到编辑器中
    void setEditorData(QWidget *editor, const QModelIndex &index) const override
    {
        int value = index.model()->data(index, Qt::EditRole).toInt();
        QSpinBox *spinBox = static_cast<QSpinBox*>(editor);
        spinBox->setValue(value);
    }

    // 将编辑器中的数据保存到模型中
    void setModelData(QWidget *editor, QAbstractItemModel *model,
                      const QModelIndex &index) const override
    {
        QSpinBox *spinBox = static_cast<QSpinBox*>(editor);
        int value = spinBox->value();
        model->setData(index, value, Qt::EditRole);
    }

    // 更新编辑器的几何形状,确保编辑器显示在正确位置
    void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option,
                              const QModelIndex &index) const override
    {
        editor->setGeometry(option.rect);
        QStyledItemDelegate::updateEditorGeometry(editor, option, index);
    }
};

调用:

cpp 复制代码
#include <QtWidgets>


int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    // 创建一个表格视图
    QTableView tableView;

    // 创建一个标准的表格数据模型
    QStandardItemModel model(4, 2);
    model.setHeaderData(0, Qt::Horizontal, "Integer");
    model.setHeaderData(1, Qt::Horizontal, "Square");

    // 为表格设置数据模型
    tableView.setModel(&model);

    // 创建一个自定义代理实例
    SpinBoxDelegate delegate;
    // 将代理应用到第一列
    tableView.setItemDelegateForColumn(0, &delegate);

    // 填充表格数据
    for (int row = 0; row < 4; ++row) {
        for (int column = 0; column < 2; ++column) {
            QModelIndex index = model.index(row, column);
            if (column == 0) {
                model.setData(index, row);
            } else {
                int value = row * row;
                model.setData(index, value);
            }
        }
    }

    tableView.show();

    return app.exec();
}
相关推荐
freyazzr7 分钟前
C++八股 | Day2 | atom/函数指针/指针函数/struct、Class/静态局部变量、局部变量、全局变量/强制类型转换
c++
ascarl201012 分钟前
准确--k8s cgroup问题排查
java·开发语言
fpcc1 小时前
跟我学c++中级篇——理解类型推导和C++不同版本的支持
开发语言·c++
莱茵菜苗1 小时前
Python打卡训练营day46——2025.06.06
开发语言·python
爱学习的小道长1 小时前
Python 构建法律DeepSeek RAG
开发语言·python
luojiaao2 小时前
【Python工具开发】k3q_arxml 简单但是非常好用的arxml编辑器,可以称为arxml杀手包
开发语言·python·编辑器
终焉代码2 小时前
STL解析——list的使用
开发语言·c++
SoFlu软件机器人2 小时前
智能生成完整 Java 后端架构,告别手动编写 ControllerServiceDao
java·开发语言·架构
英英_2 小时前
视频爬虫的Python库
开发语言·python·音视频
DevangLic2 小时前
【 *p取出内容 &a得到地址】
c++