QTableWidget、QTableView表格设置输入限制0到255、0到128

项目需求:

表格里某些行/列要求限制用户只能输入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

  • 7
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
QTableWidgetQTableViewQt框架中用于显示表格数据的两个类。QTableWidget是一个预定义的表格控件,可以直接在界面上使用,而QTableView是一个更灵活的类,可以与自定义的数据模型一起使用。 QSS(Qt Style Sheets)是一种用于设置Qt应用程序界面样式的机制。它类似于CSS(Cascading Style Sheets),可以通过设置样式属性来改变控件的外观和布局。 下面是一个使用QTableWidgetQTableView的例子: 1. 使用QTableWidget创建表格设置数据: ```python from PyQt5.QtWidgets import QApplication, QTableWidget, QTableWidgetItem app = QApplication([]) table_widget = QTableWidget(3, 3) # 创建一个3行3列的表格 # 设置表头 table_widget.setHorizontalHeaderLabels(['Name', 'Age', 'Gender']) # 设置数据 data = [['Alice', '25', 'Female'], ['Bob', '30', 'Male'], ['Charlie', '35', 'Male']] for row, row_data in enumerate(data): for col, col_data in enumerate(row_data): item = QTableWidgetItem(col_data) table_widget.setItem(row, col, item) table_widget.show() app.exec_() ``` 2. 使用QTableView和自定义数据模型创建表格: ```python from PyQt5.QtWidgets import QApplication, QTableView, QStandardItemModel, QStandardItem app = QApplication([]) table_view = QTableView() # 创建数据模型 model = QStandardItemModel(3, 3) # 创建一个3行3列的数据模型 # 设置表头 model.setHorizontalHeaderLabels(['Name', 'Age', 'Gender']) # 设置数据 data = [['Alice', '25', 'Female'], ['Bob', '30', 'Male'], ['Charlie', '35', 'Male']] for row, row_data in enumerate(data): for col, col_data in enumerate(row_data): item = QStandardItem(col_data) model.setItem(row, col, item) table_view.setModel(model) table_view.show() app.exec_() ``` 3. 使用QSS设置表格样式: ```python from PyQt5.QtWidgets import QApplication, QTableWidget, QTableWidgetItem app = QApplication([]) table_widget = QTableWidget(3, 3) # 创建一个3行3列的表格 # 设置表头 table_widget.setHorizontalHeaderLabels(['Name', 'Age', 'Gender']) # 设置数据 data = [['Alice', '25', 'Female'], ['Bob', '30', 'Male'], ['Charlie', '35', 'Male']] for row, row_data in enumerate(data): for col, col_data in enumerate(row_data): item = QTableWidgetItem(col_data) table_widget.setItem(row, col, item) # 设置表格样式 table_widget.setStyleSheet("QTableView {background-color: yellow;}") table_widget.show() app.exec_() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值