自定义委托 comboboxdelegate

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
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值