实时效果如图

静态图片如下:


一、UI层使用QML的TableView 组件, 加载C++写的数据model, 然后表格 各列都可以使用不同的代理, 比如说直接编辑,下拉列表选择,选中组件。 还有增加行,删除行按钮

二、C++ 继承 QSqlRelationalTableModel 实现自定义数据model,在里面打开sqlite3数据库, 实现对应的重写接口,使UI层可以读取数据。对UI层额外实现加减行接口,

datatablemodel.h
#ifndef OFFQIMIETABLEMODEL_H
#define OFFQIMIETABLEMODEL_H
#include <QSqlRelationalTableModel>
#include <QQmlParserStatus>
#include <QItemSelectionModel>
#include <QList>
#include "offsql.h"
#include "projectparamanger.h"
class Q_DECL_EXPORT OffQiMieTableModel : public QSqlRelationalTableModel, public QQmlParserStatus
{
Q_OBJECT
Q_PROPERTY(QString database READ databaseName WRITE setDatabaseName NOTIFY databaseNameChanged)
Q_PROPERTY(QString table READ tableName WRITE setTable NOTIFY tableChanged)
Q_PROPERTY(QStringList horHeader READ getHorHeader WRITE setHorHeader NOTIFY horHeaderChanged)
public:
explicit OffQiMieTableModel(QObject *parent = nullptr);
~OffQiMieTableModel() override;
void classBegin() override;
void componentComplete() override;
QHash<int, QByteArray> roleNames() const override;
bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
// 表头
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole) override;
void setDatabaseName(const QString &fileName);
QString databaseName() const;
void setTable(const QString &tableName) override;
QString tableName() const;
QStringList getHorHeader() const;
void setHorHeader(const QStringList &header);
QString m_databaseName;
QString m_tableName;
bool m_completed = false;
mutable QHash<int, QByteArray> m_roles;
// 横项表头
QList<QString> m_horHeaderList;
signals:
void databaseNameChanged();
void tableChanged();
void horHeaderChanged();
public slots:
int add();
bool remove(int row);
void ASCSort();
private:
bool tableExists(const QString &tableName);
void createTable(const QString &tableName,const QString &createSql,const QString &data);
void createTable(const QString &tableName,const QString &createSql);
void createTableData(const QString &tableName,const QString &initdata);
void dropTable(const QString &tableName, const QString &dropSql);
void insertTableInitData();
void initTables();
};
#endif // OFFQIMIETABLEMODEL_H
三、导入导出EXECL表格功能使用 qtxlsx 库源码,解决在QT6的编译报错。




被折叠的 条评论
为什么被折叠?



