项目需求:
表格里某些行/列要求限制用户只能输入0到255之间的数字,某些行/列限制只能输入0到128
实现:
通过自定义代理类的方式。继承QStyledItemDelegate(不会导致QSS失效)或者
QItemDelegate(会导致QSS失效),官方推荐继承QStyledItemDelegate
头文件:
#ifndef CUSTOMITEMDELEGRATE_H
#define CUSTOMITEMDELEGRATE_H
#include <QWidget>
#include <QStyledItemDelegate>
#include <QLineEdit>
#include <QRegExp>
class CustomItemDelegrate : public QStyledItemDelegate
{
Q_OBJECT
public:
CustomItemDelegrate(const QRegExp& regExp, QObject* parent = nullptr);
~CustomItemDelegrate(void);
QWidget *createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index ) const;
void setEditorData(QWidget* editor, const QModelIndex& index ) const;
void setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index ) const;
private:
QRegExp m_regExp;
};
#endif // CUSTOMITEMDELEGRATE_H
实现文件
#include "CustomItemDelegrate.h"
CustomItemDelegrate::CustomItemDelegrate(const QRegExp& regExp,QObject* parent) : QStyledItemDelegate(parent)
{
m_regExp = regExp;
}
CustomItemDelegrate::~CustomItemDelegrate(void)
{
}
QWidget* CustomItemDelegrate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
//创建带有正则表达式的输入框
Q_UNUSED(option);
Q_UNUSED(index);
QLineEdit* editor = new QLineEdit(parent);
editor->setValidator(new QRegExpValidator(m_regExp, parent));
return editor;
}
void CustomItemDelegrate::setEditorData(QWidget* editor, const QModelIndex& index) const
{
QString text = index.model()->data(index, Qt::EditRole).toString();
QLineEdit* lineEdit = qobject_cast <QLineEdit*>(editor);
lineEdit->setText(text);
}
void CustomItemDelegrate::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const
{
QLineEdit* lineEdit = qobject_cast<QLineEdit*>(editor);
QString text = lineEdit->text();
model->setData(index, text, Qt::EditRole);
}
使用示例:
ui->tableWidget->setRowCount(10);
ui->tableWidget->setColumnCount(10);
QRegExp regexp_0To255("^(0|[1-9]{1,2}|[1]\\d{0,2}|2[0-4]\\d|255)$");
QRegExp regexp_0To128("^(0|[1-9]{1,2}|[1][0-2][0-8])$");
for(int row = 0; row < 10; row++)
{
if(row % 2 == 0)
{
ui->tableWidget->setItemDelegateForRow(row, new CustomItemDelegrate(regexp_0To255));
}
else
{
ui->tableWidget->setItemDelegateForRow(row, new CustomItemDelegrate(regexp_0To128));
}
}
附加:对列设置可使用:setItemDelegateForColumn;全局设置可使用:setItemDelegate