QT开发中文网

qt tableview单元格只能输入数字,且支持输入科学计数法,用c++代码实现

可以通过设置单元格的委托(QItemDelegate)来实现单元格只能输入数字和科学计数法。

具体实现步骤如下:

  1. 继承QStyledItemDelegate类,重写createEditor()、setEditorData()和setModelData()方法。其中,createEditor()方法用于创建一个编辑器控件,setEditorData()方法在编辑器打开时将模型数据显示到编辑器上,setModelData()方法在编辑器关闭时将编辑器中的数据保存到模型中。

  2. 在createEditor()方法中,创建一个QLineEdit控件,并设置其validator为QDoubleValidator,这样就保证了只能输入数字。同时,还需要设置QLineEdit的inputMask属性,以支持输入科学计数法。

  3. 在TableView的构造函数中,设置需要委托的列的委托为自定义的QStyledItemDelegate子类即可。

下面是一份示例代码:

#include <QtWidgets>

class DoubleSpinBoxDelegate : public QStyledItemDelegate
{
public:
    DoubleSpinBoxDelegate(QObject *parent = nullptr)
        : QStyledItemDelegate(parent)
    {
    }

    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
                          const QModelIndex &index) const override
    {
        auto *editor = new QLineEdit(parent);
        QDoubleValidator *validator = new QDoubleValidator(editor);
        validator->setNotation(QDoubleValidator::ScientificNotation);
        editor->setValidator(validator);
        editor->setInputMask(QStringLiteral("9.9E+999;_"));
        return editor;
    }

    void setEditorData(QWidget *editor, const QModelIndex &index) const override
    {
        QString text = index.model()->data(index, Qt::EditRole).toString();
        QLineEdit *lineEdit = static_cast<QLineEdit *>(editor);
        lineEdit->setText(text);
    }

    void setModelData(QWidget *editor, QAbstractItemModel *model,
                      const QModelIndex &index) const override
    {
        QLineEdit *lineEdit = static_cast<QLineEdit *>(editor);
        QString text = lineEdit->text();
        model->setData(index, text, Qt::EditRole);
    }
};

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

    QStandardItemModel model(4, 2);
    QTableView tableView;
    tableView.setModel(&model);
    tableView.setItemDelegateForColumn(1, new DoubleSpinBoxDelegate(&tableView));

    for (int row = 0; row < model.rowCount(); ++row) {
        for (int column = 0; column < model.columnCount(); ++column) {
            QModelIndex index = model.index(row, column, QModelIndex());
            model.setData(index, QVariant((row + 1) * (column + 1)));
        }
    }

    tableView.show();
    return app.exec();
}

在上面的示例代码中,我们创建了一个QStandardItemModel,并且设置它的行数为4,列数为2。然后,在第二列中设置委托为DoubleSpinBoxDelegate。最后,我们使用setData()方法向模型中填充数据。

运行程序后,单元格只能输入数字,且支持输入科学计数法。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://qt.0voice.com/?id=1289

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?