QT的MVC(View/Delegate)模型十分强大,可以利用各种控件来对表格的输入进行限制。
QTableView使用自定义委托(QItemDelegate),实现表格中的下拉框以及单元格输入值限制
comboboxdelegate.cpp
#include <QtGui>
#include "comboboxdelegate.h"
#include <QComboBox>
#include <QCompleter>
ComoboBoxDelegate::ComoboBoxDelegate(QTableWidget *table,QObject *parent)
: QItemDelegate(parent)
{
table_widget = table;
}
QWidget *ComoboBoxDelegate::createEditor(QWidget *parent,
const QStyleOptionViewItem &/* option */,
const QModelIndex &/* index */) const
{
QComboBox *editor = new QComboBox(parent);
QStringList list;
int row = table_widget->currentRow();
int col = table_widget->currentColumn();
QString type =table_widget->item(row,17)->text();
bool canEdit = true;
QString object = table_widget->objectName();
if (object == "tableWidget_big")
{
if (col == 4)//材料
{
if (type == "0")
list = QStringLiteral("木头");
else if (type == "1")
list = QStringLiteral("钢筋");
else if (type == "2")
list = QStringLiteral("塑料");
}
if (col == 5)//品牌
{
if (type == "0")
list =QStringLiteral("品牌A")i;
else if (type == "1")
list = QStringLiteral("品牌B");
else if (type == "2")
list = QStringLiteral("品牌C");
}
if (col == 7)//单位
{
if (type == "0")
list = "°";
else if (type == "1")
list = bridge_->defaultData_.peijian_danwei;
else if (type == "2")
list = bridge_->defaultData_.aZMaterial_danwei;
}
}
else if(object == "tableWidget_GYLC")
{
if (col == 0)
list = bridge_->defaultData_.shebeiCanChangeName;
else if (col == 1)
{
list = bridge_->defaultData_.shebeiName;
canEdit = false;
}
}
//else if (object == "tableWidget_shebeiDB_addParam")
//{
// int a = 0;
//}
editor->addItems(list);
editor->setEditable(canEdit);
//editor->setStyleSheet("QComboBox::drop-down{\"border-style:none;border:none}\"");//隐藏下拉箭头
QCompleter *MyInfor = new QCompleter(editor->model());
MyInfor->setCaseSensitivity(Qt::CaseInsensitive);//大小写不敏感
MyInfor->setFilterMode(Qt::MatchContains); //匹配规则:内容匹配
editor->setCompleter(MyInfor);
QString currentText = bridge_->get_string_from_table(table_widget->item(row, col));
list.append(currentText);
editor->setFixedWidth(SetComBoxLength(list));
editor->installEventFilter(const_cast<ComoboBoxDelegate*>(this));
return editor;
}
//设置下拉框长度
int ComoboBoxDelegate::SetComBoxLength(QStringList list)const
{
int length = 0;
int max_length = 0;
for (int i = 0; i < list.length(); i++)
{
if (list[i].length()>max_length)
max_length = list[i].length();
}
length = max_length * 9 * 1.7;
if (length == 0)
length = 100;
return length + 20;
}
//! [1]
//! [2]
void ComoboBoxDelegate::setEditorData(QWidget *editor,
const QModelIndex &index) const
{
QString value = index.model()->data(index, Qt::EditRole).toString();
QComboBox *comboBox = static_cast<QComboBox*>(editor);
int row = table_widget->currentRow();
int col = table_widget->currentColumn();
QString currentText = bridge_->get_string_from_table(table_widget->item(row, col));
comboBox->setCurrentText(currentText);
//int cindex = comboBox->findText(value);
//comboBox->setCurrentIndex(cindex);
}
//! [2]
//! [3]
void ComoboBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index) const
{
QComboBox *comboBox = static_cast<QComboBox*>(editor);
//comboBox->interpretText();
QString value = comboBox->currentText();
model->setData(index, value, Qt::EditRole);
}
//! [3]
//! [4]
void ComoboBoxDelegate::updateEditorGeometry(QWidget *editor,
const QStyleOptionViewItem &option, const QModelIndex &/* index */) const
{
editor->setGeometry(option.rect);
}
//! [4]
comboboxdelegate.h
#ifndef DELEGATE1_H
#define DELEGATE1_H
#include <QItemDelegate>
#include <QModelIndex>
#include <QObject>
#include <QSize>
#include <QTableWidget>
class Bridge;
//! [0]
class LineEditDelegate : public QItemDelegate
{
Q_OBJECT
public:
LineEditDelegate(QTableWidget *table, QObject *parent = 0);
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;
void updateEditorGeometry(QWidget *editor,
const QStyleOptionViewItem &option, const QModelIndex &index) const;
private:
QTableWidget *table_widget;
Bridge *bridge_;
};
//! [0]
#endif
lineeditdelegate.cpp
#include <QtGui>
#include "lineeditdelegate.h"
#include <QLineEdit>
#include "Bridge.h"
//! [0]
LineEditDelegate::LineEditDelegate(QTableWidget *table, QObject *parent)
: QItemDelegate(parent)
{
table_widget = table;
bridge_ = Bridge::GetInstance();
}
//! [0]
//! [1]
QWidget *LineEditDelegate::createEditor(QWidget *parent,
const QStyleOptionViewItem &/* option */,
const QModelIndex &/* index */) const
{
int row = table_widget->currentRow();
int col = table_widget->currentColumn();
QString object = table_widget->objectName();
QLineEdit *editor = new QLineEdit(parent);
if (object == "tableWidget_big")
{
if (col == 6)
bridge_->setRegExpNum(editor, 2);//6 数量
else if (col == 8)
bridge_->setRegExpNum(editor, 4);//8 报价 带两位小数
else if (col == 9)
bridge_->setRegExpNum(editor, 6);//9 报价倍率正数
else if (col == 11)
bridge_->setRegExpNum(editor, 3);//11 库存量正整数:包括0
else if (col == 13)
bridge_->setRegExpNum(editor, 4);//13 采购单价 带两位小数
}
else if (object == "tableWidget_GYLC")
{
if (col == 4)
bridge_->setRegExpNum(editor, 2);//4 数量
}
return editor;
}
//! [1]
//! [2]
void LineEditDelegate::setEditorData(QWidget *editor,
const QModelIndex &index) const
{
QString value = index.model()->data(index, Qt::EditRole).toString();
QLineEdit *lineEdit = static_cast<QLineEdit*>(editor);
lineEdit->setText(value);
}
//! [2]
//! [3]
void LineEditDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index) const
{
QLineEdit *lineEdit = static_cast<QLineEdit*>(editor);
//comboBox->interpretText();
QString value = lineEdit->text();
model->setData(index, value, Qt::EditRole);
}
//! [3]
//! [4]
void LineEditDelegate::updateEditorGeometry(QWidget *editor,
const QStyleOptionViewItem &option, const QModelIndex &/* index */) const
{
editor->setGeometry(option.rect);
}
//! [4]
lineeditdelegate.h
#ifndef DELEGATE_H
#define DELEGATE_H
#include <QItemDelegate>
#include <QModelIndex>
#include <QObject>
#include <QSize>
#include <QSpinBox>
#include <QTableWidget>
class Bridge;
//! [0]
class ComoboBoxDelegate : public QItemDelegate
{
Q_OBJECT
public:
ComoboBoxDelegate(QTableWidget *table,QObject *parent = 0);
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;
void updateEditorGeometry(QWidget *editor,
const QStyleOptionViewItem &option, const QModelIndex &index) const;
private:
QTableWidget *table_widget;
Bridge *bridge_;
int SetComBoxLength(QStringList list)const;
};
//! [0]
#endif