QT学习--UI控件--QListView

本文介绍了在QT项目中使用QListView显示历史记录,详细讲解了QListView的使用,包括内容类、代理类和过滤器类的应用,并提供代码示例。文章最后总结了使用这些自定义组件可以实现QListView的个性化操作,但还面临如何实现选中行放大效果的挑战。


前言

原因:记录QT学习中遇到的问题,方便记录回看。
环境:vs2017+QT5.9.1


一、QListView使用

示例:在项目中用QListView做历史记录的显示,用MyListDelegate做QListView的样式,用QAbstractItemModel做显示的内容。

二、代码示例

代码如下(示意函数用法,不能单独运行):

1.显示的内容类

class MyModel : public QAbstractItemModel
{
...
private:
	QList<MyInfo *> m_items;//MyInfo是具体的内容类
...
}

2.显示的代理类

MyListDelegate.h

class MyListDelegate : public QStyledItemDelegate
{
    Q_OBJECT

public:
    explicit MyListDelegate(QObject *parent = nullptr);
    ~MyListDelegate();
    QSize sizeHint(const QStyleOptionViewItem &option,
                   const QModelIndex &index) const override;
    void paint(QPainter *painter,
               const QStyleOptionViewItem &option, const QModelIndex &index) const override;
	QString loadFontFamilyFromFiles(const QString &fontFileName) const;
public:
	QPixmap pixmap;
	QString family;
	QPixmap normal;
	QPixmap red;
	QPixmap yellow;
};

MyListDelegate.c

MyListDelegate::MyListDelegate(QObject *parent) : QStyledItemDelegate(parent)
{
	family = loadFontFamilyFromFiles(QApplication::applicationDirPath() +
		QString::fromLocal8Bit("/res/font/华康俪金黑W8.TTF"));
	//从资源管理器中加载设计好的Ui图片
	pixmap = QPixmap(":/images/res/item_bg.png");
	normal = QPixmap(":/images/res/alarm_normal.png");
	red = QPixmap(":/images/res/alarm_red.png");
	yellow = QPixmap(":/images/res/alarm_yellow.png");
}
//sizeHint控制QListView每个控件的大小
QSize MyListDelegate::sizeHint(const QStyleOptionViewItem &option,
                               const QModelIndex &index) const
{
	Q_UNUSED(index)
    //return QSize(option.rect.height() + (option.rect.height() / 10), option.rect.height());
		return QSize(pixmap.width(), pixmap.height());
}
//QListView中每个Item的显示样式
void MyListDelegate::paint(QPainter *painter,
                           const QStyleOptionViewItem &option, const QModelIndex &index) const
{
	QRect rect(option.rect.x(), option.rect.y(), 
		option.rect.width() - option.rect.height() / 10, option.rect.height());

	if (!index.isValid()) {
		return;
	} 
    QVariant var = index.data(Qt::UserRole);
	MyInfo* itemData = var.value<MyInfo*>();
	painter->drawPixmap(rect, pixmap);
	//设置字体
	QFont ft;
	ft.setFamily("Times New Roman");
	ft.setPixelSize(textSize + 3);
	ft.setWeight(QFont::Bold);
	painter->setFont(ft);
	//根据内容itemData的具体内容绘制具体显示
	painter->drawText(itemData->text(), Qt::AlignLeft | Qt::AlignVCenter, tempTitle);
	...
	...
	//设置鼠标选中、滑过和其他的显示效果
	if (option.state.testFlag(QStyle::State_Selected))
	{
		painter->drawPixmap(rect, pixmap1);
	}
	else if (option.state.testFlag(QStyle::State_MouseOver))
	{

	}
	else {

	}
}

3.使用的过滤器类

4.使用

	//用自己设计的delegate样式,主要是修改其中的paint方法
	MyListDelegate *delegate = new MyListDelegate(this);
	ui.listView_Log->setItemDelegate(delegate);
	userInfoModel = new MyModel();
	//用过滤器实现userInfoModel内容的过滤、排序等功能。MyProxyModel中设置了一些过滤条件
	listviewProxy = new MyProxyModel(this);
	listviewProxy->setColumn(HistoryModel::LogTimeColumn);
	listviewProxy->setDynamicSortFilter(true);
	listviewProxy->sort(0, Qt::DescendingOrder);
	listviewProxy->setStartDayTime(start);
	//将userInfoModel内容设置进过滤器
	listviewProxy->setSourceModel(userInfoModel);
	//将过滤器的内容设置到ui中的QListView控件
	ui.listView_Log->setModel(listviewProxy);

总结

这里对文章进行总结:
使用以上继承类可以实现QListView的内容、样式、筛选等等个性操作。
后续考虑实现简单的可运行的代码例子。

问题

1:想实现鼠标选中行,显示变大的效果还没实现。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值