QListView自定义item(结合QSqlQueryModel)

QListView:绘制自定义List(一)------设置ItemDelegate_qt_繁星执着-开放原子开发者工作坊 (csdn.net)

QListView自定义Item_qlistview 自定义item-CSDN博客

结合我写的上一篇文章:

QTableView与QSqlQueryModel的简单使用-CSDN博客

这次尝试让QListView与QSqlQueryModel结合使用。

但经过尝试,我觉得它们不适合放在一起使用,

因为感觉不是很好用。

QSqlQueryModel的基类是QAbstractTableModel

所以其实QSqlQueryModel更适合与QTableView结合起来使用。

QListView实际上是只有一列的QTableView。

下面是实践的源码:

cpp 复制代码
#pragma once

#include <QStyledItemDelegate>
#include <qmetatype.h>

class QListView;
class WItemDelegate  : public QStyledItemDelegate
{
	Q_OBJECT

public:
	WItemDelegate(QListView *parent = nullptr);
	~WItemDelegate();
    void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override;
    QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const override;
};
cpp 复制代码
#include "WItemDelegate.h"
#include "qlistview.h"
#include "qpainter.h"
#include "qsqlquerymodel.h"
#include <qdebug.h>
WItemDelegate::WItemDelegate(QListView*parent)
	: QStyledItemDelegate(parent)
{}

WItemDelegate::~WItemDelegate()
{}
QSize WItemDelegate::sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const
{
	return QSize(option.rect.width(), 60);
}
void WItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
    if (index.isValid()) {
        int row=index.row();
        QSqlQueryModel* Model = (QSqlQueryModel*)index.model();
        QVariant rowid = index.data(Qt::DisplayRole);
        QVariant col1 = Model->index(row, 1).data(Qt::DisplayRole);
        QVariant col2 = Model->index(row, 2).data(Qt::DisplayRole);
        QRect rect = option.rect;
        qDebug() << rect;
        int wx = 5;
        int wy = 5;
        rect.setX(rect.x() + wx);
        rect.setY(rect.y() + wy);
        rect.setWidth(rect.width() - wx * 2);
        rect.setHeight(rect.height() - wy * 2);
        qDebug() << rect;
        QString text = QString("rowid:%1,col1:%2,col2:%3").arg(rowid.toInt()).arg(col1.toInt()).arg(col2.toInt());
        painter->setBrush(QColor(0, 0, 0));
        painter->drawRoundedRect(rect, 5, 5);
        painter->setPen(QColor(255, 255, 255));
        painter->drawText(rect, text,QTextOption(Qt::AlignCenter));
    }
}
cpp 复制代码
#include "SqlQueryModel.h"
#include "qfiledialog.h"
#include "qsqldatabase.h"
#include "qsqlerror.h"
#include "qsqlrecord.h"
#include "qmessagebox.h"
#include "qapplication.h"
#include "qboxlayout.h"
#include "WItemDelegate.h"
#include "Config/config.h"
SqlQueryModel::SqlQueryModel(QWidget *parent)
	: QMainWindow(parent)
{
    QString aFile = QString::fromLocal8Bit("E:/桌面/3.db");
    if (aFile.isEmpty())
        return;

    //打开数据库
    DB = QSqlDatabase::addDatabase("QSQLITE"); //添加 SQL LITE数据库驱动
    DB.setDatabaseName(aFile); //设置数据库名称
    if (!DB.open())   //打开数据库
    {
        QMessageBox::warning(this, "错误", "打开数据库失败",
            QMessageBox::Ok, QMessageBox::NoButton);
        return;
    }
    qryModel = new QSqlQueryModel(this);
    qryModel->setQuery("select rowid,col1,col2 from test;");
    if (qryModel->lastError().isValid())
    {
        QMessageBox::critical(this, "错误", "数据表查询错误,错误信息\n" + qryModel->lastError().text(),
            QMessageBox::Ok, QMessageBox::NoButton);
        return;
    }

    listView = new QListView;
    listView->setModel(qryModel);
    WItemDelegate* wItemDelegate = new WItemDelegate(listView);
    listView->setItemDelegate(wItemDelegate);
    listView->show();
}

在获取数据的时候,有点别扭:

index是第row行第0列的索引

根据index得到row和model

然后得到第row行第1列和第2列的索引

cpp 复制代码
        int row=index.row();
        QSqlQueryModel* Model = (QSqlQueryModel*)index.model();
        QVariant rowid = index.data(Qt::DisplayRole);
        QVariant col1 = Model->index(row, 1).data(Qt::DisplayRole);
        QVariant col2 = Model->index(row, 2).data(Qt::DisplayRole);

效果图:

相关推荐
Starry-sky(jing)8 分钟前
# Linux 下 Qt 应用无障碍自动化:记一次wx无人值守系统的架构演进
linux·qt·自动化
oort12313 分钟前
VLStream:全开源决策式AI视频平台,赋能企业构建自主可控、降本增效的智能视觉应用介绍
大数据·开发语言·人工智能·开源·音视频·数据库架构
c2385644 分钟前
c/c++中的多态(上)
开发语言·c++
彷徨而立1 小时前
【C++】介绍 std::ifstream 输入文件流
开发语言·c++
罗超驿1 小时前
13.JavaScript 新手入门指南:语法、变量、流程控制全解析
开发语言·javascript
yingjie1101 小时前
Scanpy vs Seurat 深度对比:Python 与 R 的单细胞分析框架谁更强?
开发语言·python·r语言·生物信息学·单细胞转录组·seurat·scanpy
程序大视界1 小时前
【C++ 从基础到项目实战】C++(六):拷贝控制——浅拷贝与深拷贝,兼谈智能指针
开发语言·c++·cpp
luck_bor1 小时前
IO流知识点笔记
java·开发语言·笔记
程序大视界2 小时前
【Python系列课程】Pandas(四):数据统计与排序——describe、sort_values、sample
开发语言·python·pandas
KWTXX2 小时前
使用matlab官网的skills调用claude-待完成
开发语言·matlab