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:想实现鼠标选中行,显示变大的效果还没实现。
推荐阅读
-
IOS UI学习教程之使用UIImageView控件制作动画
-
IOS UI学习教程之使用UIImageView控件制作动画
-
Qt学习笔记(自定义控件)
-
Qt 5.12学习笔记--控件TreeView介绍
-
【Android Studio JAVA 学习笔记】UI控件
-
C++图形用户界面开发框架Qt 6.x - 基于Qt Widget的UI工具 QtC++界面控件
-
Flutter学习指南:UI布局和控件
-
Qt学习笔记11:自定义控件增加属性并通过qss设置样式
-
Android学习-常见的UI控件 TextView、EditText和ImageView
-
Angular学习笔记之集成三方UI框架、控件的示例