QTableView 使用代理绘制多个图片

效果展示

实例代码

 QString city = QString::fromLocal8Bit("北京、上海");
		QStringList cities = city.split("、");
		int x = rect.left();
		int fontHeight = painter->fontMetrics().height();
		for (int i = 0; i < cities.size(); ++i) {
			painter->drawText(x, rect.top(), rect.width(), rect.height(), Qt::AlignLeft | Qt::AlignVCenter, cities[i]);
			QPixmap pixmap(QString::fromLocal8Bit("../Data/TestImage/china.png"));
			int textWidth = painter->fontMetrics().width(cities[i]) + 2;
			 QPixmap scaledPixmap = pixmap.scaledToHeight(fontHeight, Qt::SmoothTransformation);
			 // 计算图标垂直居中的位置
			 int iconY = rect.top() + (rect.height() - scaledPixmap.height()) / 2;
			painter->drawPixmap(x+ textWidth , iconY, scaledPixmap.width(), scaledPixmap.height(), scaledPixmap);
			//painter->drawText(x+ textWidth + scaledPixmap.width()+1, iconY, rect.width(), rect.height(), Qt::AlignLeft | Qt::AlignVCenter, "、");
			// 只在不是最后一个元素时添加"、"
			if (i < cities.size() - 1) {
				painter->drawText(x+ textWidth + scaledPixmap.width()+1, rect.top(), rect.width(), rect.height(), Qt::AlignLeft | Qt::AlignVCenter, "、");
				x += painter->fontMetrics().width("、") + 2; // 增加“、”的宽度和间距
			}
			x += textWidth + rect.height() + 5; // 增加间距,避免图标重叠

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,让我来回答你的问题。在Qt中,可以通过使用QItemDelegate类来自定义QTableView中单元格的显示方式。对于复选框,我们可以使用QCheckBox类来实现。 首先,我们需要创建一个自定义的代理类,例如MyCheckBoxDelegate。在这个代理类中,我们需要重写createEditor()方法和setEditorData()方法来创建并初始化QCheckBox,以及将数据设置到编辑器中。同时,我们还需要重写setModelData()方法来将编辑器中的值存储回模型中。 下面是一个简单的例子: ```cpp class MyCheckBoxDelegate : public QItemDelegate { public: QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const override { QCheckBox* editor = new QCheckBox(parent); editor->setTristate(false); return editor; } void setEditorData(QWidget* editor, const QModelIndex& index) const override { bool value = index.model()->data(index, Qt::EditRole).toBool(); QCheckBox* checkbox = static_cast<QCheckBox*>(editor); checkbox->setChecked(value); } void setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const override { QCheckBox* checkbox = static_cast<QCheckBox*>(editor); model->setData(index, checkbox->isChecked(), Qt::EditRole); } }; ``` 接下来,在使用QTableView的地方,我们需要为需要显示复选框的列设置代理。例如,我们需要为第二列设置代理,代码如下: ```cpp QTableView* tableView = new QTableView(); tableView->setItemDelegateForColumn(1, new MyCheckBoxDelegate()); ``` 最后,我们需要在模型中存储复选框的状态。例如,我们可以使用QStandardItemModel,代码如下: ```cpp QStandardItemModel* model = new QStandardItemModel(); model->setColumnCount(2); for (int row = 0; row < rowCount; ++row) { QStandardItem* item1 = new QStandardItem("text"); QStandardItem* item2 = new QStandardItem(); item2->setCheckable(true); item2->setCheckState(Qt::Unchecked); model->setItem(row, 0, item1); model->setItem(row, 1, item2); } tableView->setModel(model); ``` 这样,我们就可以在QTableView中显示复选框,并且可以选中了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值