QTableWidget自定义代理实现表格加入下拉框

 参考链接:链接

主界面Widget.cpp:

void Widget::init()
{

	QStringList tableHeaderList;
	tableHeaderList << tr("num") << tr("name") << tr("class");
	tblWgt->setRowCount(2);
	tblWgt->setColumnCount(tableHeaderList.size());

	tblWgt->horizontalHeader()->setStretchLastSection(true);

	tblWgt->setItem(0, 0, new QTableWidgetItem("text00"));
	tblWgt->item(0, 0)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
	tblWgt->item(0, 0)->setFlags(tblWgt->item(0, 0)->flags() & (~Qt::ItemIsEditable));

	tblWgt->setItem(0, 1, new QTableWidgetItem("text01"));
	tblWgt->item(0, 1)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
	tblWgt->item(0, 1)->setFlags(tblWgt->item(0, 1)->flags() & (~Qt::ItemIsEditable));

	tblWgt->setItem(1, 0, new QTableWidgetItem("text10"));
	tblWgt->item(1, 0)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
	tblWgt->item(1, 0)->setFlags(tblWgt->item(1, 0)->flags() & (~Qt::ItemIsEditable));

	tblWgt->setItem(1, 1, new QTableWidgetItem("text11"));
	tblWgt->item(1, 1)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
	tblWgt->item(1, 1)->setFlags(tblWgt->item(1, 1)->flags() & (~Qt::ItemIsEditable));

	MyItemDelegate *ComDelegate = new MyItemDelegate;
	tblWgt->setItemDelegateForColumn(2, ComDelegate); //设置表格的第三列为自定义代理
}

 MyItemDelegate.h:

class MyItemDelegate : public QItemDelegate
{
	Q_OBJECT

public:
	MyItemDelegate(QObject *parent=Q_NULLPTR);
	~MyItemDelegate();

protected:
	virtual QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
	// 设置控件显示的数据
	virtual void  setEditorData(QWidget *editor, const QModelIndex &index) const override;
	//对数据的改变更新到Model中
	virtual void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override;
	//完成控件的大小
	virtual void  updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
};

MyItemDelegate.cpp:

MyItemDelegate::MyItemDelegate(QObject *parent)
	: QItemDelegate(parent)
{
}

MyItemDelegate::~MyItemDelegate()
{
}

QWidget *MyItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
	Q_UNUSED(option);
	Q_UNUSED(index);
	QComboBox *editor = new QComboBox(parent);
	QStringList list;
	list << "111";
	list << "222";
	list << "333";
	list << "444";
	list << "555";
	editor->addItems(list);

	return editor;
}

void MyItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
	QString str = index.model()->data(index).toString();
	QComboBox *box = static_cast<QComboBox*>(editor);
	int i = box->findText(str);
	box->setCurrentIndex(i);
}

void MyItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
	QComboBox *box = static_cast<QComboBox*>(editor);
	QString str = box->currentText();
	model->setData(index, str);
}

void MyItemDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
	Q_UNUSED(index);
	editor->setGeometry(option.rect);
}

此时表格第三列的每一格,双击后都会显示QComboBox,再点击后出现下拉选项

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyQt5是一个Python编程语言的工具包,用于创建图形用户界面(GUI)。SQLite是一个轻量级的嵌入式数据库引擎,它可以轻松地集成到应用程序中。QTableWidget是PyQt5中一个用于显示和编辑二维表格数据的小部件。 在PyQt5中,使用QTableWidget来显示SQLite数据库中的数据,可以按照以下步骤进行操作: 1. 首先,导入需要的模块:`from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem` 并连接到SQLite数据库:`import sqlite3` 2. 创建一个继承自QMainWindow的自定义窗口类,并在窗口的初始化方法中设置布局等属性。 3. 创建一个QTableWidget实例,并设置它的行数和列数:`table = QTableWidget(row_count, col_count)` 4. 连接到SQLite数据库:`conn = sqlite3.connect('your_database.db')` 5. 创建一个游标对象:`cursor = conn.cursor()` 6. 执行SQL查询语句获取数据库中的数据:`cursor.execute('SELECT * FROM your_table')` 7. 使用fetchall()方法获取查询结果:`data = cursor.fetchall()` 8. 遍历查询结果,并将数据逐行添加到QTableWidget中:`for row_number, row_data in enumerate(data):` `for column_number, column_data in enumerate(row_data):` `table.setItem(row_number, column_number, QTableWidgetItem(str(column_data)))` 9. 最后,关闭数据库连接:`conn.close()` 10. 将QTableWidget添加到窗口的主布局中:`self.setCentralWidget(table)` 通过以上步骤,就可以使用PyQt5和SQLite数据库来显示自定义表格数据。在需要时,可以根据需求对QTableWidget进行自定义样式的设置,例如设置列宽、行高、表头等。 希望以上回答对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值