欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

QT学习--UI控件--QListView

程序员文章站 2022-03-31 19:29:58
...


前言

原因:记录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:想实现鼠标选中行,显示变大的效果还没实现。

相关标签: QT学习