QT-Mysql数据库图形化接口

QT += sql

mysqloper.h

qsqlrelationaltablemodelview.h

/*************************************************************************
接口描述:Mysql数据库图形化接口
拟制:
接口版本:V1.0
时间:20230727
说明:支持是否创建界面类QTableView,默认QTableView不允许增删改查功能,支持创建外键表
*************************************************************************/
#ifndef QSQLRELATIONALTABLEMODELVIEW_H
#define QSQLRELATIONALTABLEMODELVIEW_H#include <qsqlrelationaltablemodel.h>
#include <qsqlrelationaldelegate.h>
#include <QTableView>
#include <QMenu>
#include <QHeaderView>
#include <QMessageBox>
#include "mysqloper.h"//源码在其他博文中
#include <QDateTimeEdit>
#include <QStyledItemDelegate>class QDateTimeItemDelegate : public QStyledItemDelegate
{Q_OBJECTpublic:explicit QDateTimeItemDelegate(QString qsDataFormat = "yyyy/MM/dd HH:mm:ss", QObject *parent = nullptr): QStyledItemDelegate(parent){m_qsDataFormat = qsDataFormat;};private:QString m_qsDataFormat;// QStyledItemDelegate interface
public:virtual QString displayText(const QVariant &value, const QLocale &locale) const override{if(value.type() == QVariant::DateTime){return value.toDateTime().toString(m_qsDataFormat);}return QStyledItemDelegate::displayText(value, locale);};virtual QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override{const QSqlRelationalTableModel *sqlModel = qobject_cast<const QSqlRelationalTableModel *>(index.model());QVariant variant = sqlModel->data(index, Qt::DisplayRole);if(variant.type() == QVariant::DateTime){QDateTimeEdit* pDateTimeEdit = new QDateTimeEdit(parent);pDateTimeEdit->setDateTime(variant.toDateTime());pDateTimeEdit->setCalendarPopup(true);pDateTimeEdit->setDisplayFormat(m_qsDataFormat);return pDateTimeEdit;}return QStyledItemDelegate::createEditor(parent, option, index);};
};class QSqlRelationalTableModelEx : public QSqlRelationalTableModel
{Q_OBJECTpublic:explicit QSqlRelationalTableModelEx(QObject *parent = nullptr,QSqlDatabase db = QSqlDatabase()):QSqlRelationalTableModel(parent, db){};protected:QMap<int, QColor> m_relationTextColorMap;QList<QColor> m_colTextColor;public:void InsertRelationTextColorMap(int column, QColor color){m_relationTextColorMap.insert(column, color);};void AppendcolTextColorList(QColor color){m_colTextColor.append(color);};// QAbstractItemModel interface
public:virtual QVariant data(const QModelIndex &index, int role) const override{if(role == Qt::TextAlignmentRole){return Qt::AlignCenter;}else if(role == Qt::TextColorRole){if(relation(index.column()).isValid()){QColor color = m_relationTextColorMap.value(index.column());if(color.isValid()){return color;}}if(m_colTextColor.size() > index.column()){QColor color = m_colTextColor.at(index.column());if(color.isValid()){return color;}}}return QSqlRelationalTableModel::data(index, role);};
};class QViewObject : public QObject
{Q_OBJECTpublic:QViewObject(QTableView* pTableView, QSqlRelationalTableModelEx* pSqlRelationalTableModel):m_pTableView(pTableView), m_pSqlRelationalTableModel(pSqlRelationalTableModel),m_bAdd(false), m_bDel(false), m_bUpdate(false){};private:QMenu m_menu;QTableView* m_pTableView;QSqlRelationalTableModelEx* m_pSqlRelationalTableModel;bool m_bAdd;bool m_bDel;bool m_bUpdate;QList<QAction *> m_ActionList;public:void AddAction(QAction* pAction){m_ActionList.append(pAction);this->connectViewClick();}void SetMode(bool bAdd = false, bool bDel=false, bool bUpdate = false){m_bAdd = bAdd;m_bDel = bDel;m_bUpdate = bUpdate;if(m_bUpdate){m_pTableView->setEditTriggers(QAbstractItemView::DoubleClicked);}else{m_pTableView->setEditTriggers(QAbstractItemView::NoEditTriggers);}this->connectViewClick();}void connectViewClick(){m_menu.clear();QAction *pActionRefresh= new QAction("刷新", this);m_menu.addAction(pActionRefresh);connect(pActionRefresh, &QAction::triggered, this, [&] {m_pSqlRelationalTableModel->select();});if(m_bAdd){QAction *pActionAdd= new QAction("增加", this);m_menu.addAction(pActionAdd);connect(pActionAdd, &QAction::triggered, this, [&] {int rowCount = m_pSqlRelationalTableModel->rowCount();m_pSqlRelationalTableModel->insertRow(rowCount);//m_pSqlRelationalTableModel->setData(m_pSqlRelationalTableModel->index(rowCount, 0), "");m_pTableView->setEditTriggers(QTableView::DoubleClicked);m_pTableView->scrollToBottom();});}if(m_bDel){QAction *pActionDel= new QAction("删除", this);m_menu.addAction(pActionDel);connect(pActionDel, &QAction::triggered, this, [&] {if (QMessageBox::warning(m_pTableView, "提示", "确定删除选中行?", QMessageBox::Yes, QMessageBox::No) == QMessageBox::No) {m_pSqlRelationalTableModel->revertAll();return;}QModelIndexList modelIndexList = m_pTableView->selectionModel()->selectedRows();foreach(QModelIndex modelIndex, modelIndexList){m_pSqlRelationalTableModel->removeRow(modelIndex.row());}m_pSqlRelationalTableModel->submitAll();});}if(m_bUpdate){QAction *pActionUpdate= new QAction("保存", this);m_menu.addAction(pActionUpdate);connect(pActionUpdate, &QAction::triggered, this, [&] {m_pSqlRelationalTableModel->submitAll();});}if(m_bAdd || m_bDel || m_bUpdate){QAction *pActionRevert= new QAction("撤销", this);m_menu.addAction(pActionRevert);connect(pActionRevert, &QAction::triggered, this, [&] {m_pSqlRelationalTableModel->revertAll();});}m_menu.addSeparator();foreach(QAction* pAction, m_ActionList){m_menu.addAction(pAction);}connect(m_pTableView, &QTableView::customContextMenuRequested, this, [&]{m_menu.move(m_pTableView->cursor().pos());m_menu.show();});};
};template<typename TEMP>
class QSqlRelationalTableModelView
{public:QSqlRelationalTableModelView(QString qsTableName/*关联的表名*/, bool bCreatView = false/*是否创建界面类QTableView*/);~QSqlRelationalTableModelView();private:QTableView* m_pTableView;QViewObject* m_pViewObject;QSqlRelationalTableModelEx* m_pSqlRelationalTableModel;bool m_bView;//存在ViewQString m_qsTableName;MySqlOper* m_pMySqlOper;QList<TSerialisation> m_tSerialisationList;QList<QString> m_headList;QList<QString> m_headListTitle;QMap<int, QSqlRelationalTableModelView*> m_relationModelViewMap;QString m_qsDateFormat;private:QSqlRelationalTableModelView*  findAndCreatRelationalTableModelView(int column);protected:QList<TSerialisation> getSerialisationList(){return m_tSerialisationList;};QList<QString> getHeadList(){return m_headList;};QList<QString> getHeadListTitle(){return m_headListTitle;};QString getTableName(){return m_qsTableName;};QString getDateFormat(){return m_qsDateFormat;};public:QTableView* GetTableView();//获得列表void SetRelation(int column/*当前表列号*/,const QString &aTableName/*关联外键的父表名*/,const QString &indexCol/*关联父表的字段名*/,const QString &displayCol/*显示父表的字段名*/,const QColor &colorCol = QColor()/*显示父表颜色,优先级高于显示颜色*/);//设置外键bool SQL_Init(QString csUser, QString csPasswd, QString csDB, QString csHost = "127.0.0.1", int nPort = 3306);//数据库初始化void SetSerialisationHead(const QString qsHead/*数据库表字段名*/, const QString qsHeadTitle/*列表头标题*/, TSerialisation tSerialisation, const QColor &colorCol = QColor()/*显示颜色*/);//设置序列化表头QList<TEMP> SQL_QueryData(QString csSql);//前提SetSerialisationHead必须按照表结构严格输入,否则请使用SQL_QuerySerialisation方法,Sql查询本表数据,返回本表字段必须是本表所有字段且不包含其他表字段char* SQL_QuerySerialisation(QString csSql, int& nQuerySize/*结果集个数*/, QList<TSerialisation> tSerialisationList = QList<TSerialisation>());//序列化查询数据库 需删除返回值void InitView();//初始化列表,如果不创建界面类QTableView无需调用QSqlRelationalTableModelEx* GetModel();//获得外键QSqlRelationalTableModelEx*void SetMode(bool bAdd = false, bool bDel=false, bool bUpdate = false);//设置列表的增删改是否可用void SetSortingEnabled(bool enable); //启用排序 默认是禁用排序的void AddAction(QAction* pAction);//添加自定义右键菜单QSqlTableModel *RelationModel(int column);//获得外键表模型void SetDateTimeFormat(QString qsDateFormat);//设置时间格式化格式/*外键列表函数*/QTableView* GetRelationTableView(int column);//获得外键列表QSqlRelationalTableModelEx* GetRelationModel(int column);//获得外键QSqlRelationalTableModelEx*void SetRelationModelHead(int column, const QString qsHead/*数据库表字段名*/, const QString qsHeadTitle/*列表头标题*/, const QColor &colorCol = QColor()/*显示颜色*/);//设置外键表表头void InitRelationView(int column);//初始化外键表列表void SetRelationMode(int column, bool bAdd = false, bool bDel=false, bool bUpdate = false);//设置列表的增删改是否可用void SetRelationSortingEnabled(int column, bool enable); //启用外键表排序 默认是禁用排序的void AddRelationAction(int column, QAction* pAction);//添加外键表自定义右键菜单
};template <typename TEMP>
QSqlRelationalTableModelView<TEMP>::QSqlRelationalTableModelView(QString qsTableName, bool bCreatView):m_bView(bCreatView), m_qsTableName(qsTableName)
{m_pMySqlOper = MySqlOper::GetInstance();m_pSqlRelationalTableModel = new QSqlRelationalTableModelEx(nullptr, *m_pMySqlOper->SQL_DataBase());if(m_bView){m_pTableView = new QTableView;m_pViewObject = new QViewObject(m_pTableView, m_pSqlRelationalTableModel);m_pViewObject->connectViewClick();}m_qsDateFormat = "yyyy/MM/dd HH:mm:ss";
}template<typename TEMP>
QSqlRelationalTableModelView<TEMP>::~QSqlRelationalTableModelView()
{if(m_pSqlRelationalTableModel != nullptr){delete m_pSqlRelationalTableModel;}MySqlOper::ReleaseInstance();
}template<typename TEMP>
QSqlRelationalTableModelView<TEMP> *QSqlRelationalTableModelView<TEMP>::findAndCreatRelationalTableModelView(int column)
{QSqlRelationalTableModelView* pSqlRelationalTableModelView = m_relationModelViewMap.value(column, nullptr);if(pSqlRelationalTableModelView == nullptr){pSqlRelationalTableModelView = new QSqlRelationalTableModelView(RelationModel(column)->tableName(), true);pSqlRelationalTableModelView->SetDateTimeFormat(m_qsDateFormat);}m_relationModelViewMap.insert(column, pSqlRelationalTableModelView);return pSqlRelationalTableModelView;
}template<typename TEMP>
void QSqlRelationalTableModelView<TEMP>::InitView()
{if(m_pSqlRelationalTableModel != nullptr && m_pTableView != nullptr){m_pTableView->setAlternatingRowColors(true);m_pTableView->setContextMenuPolicy(Qt::CustomContextMenu);m_pTableView->setSelectionBehavior(QAbstractItemView::SelectRows);//        m_pTableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);//自适应宽度m_pTableView->horizontalHeader()->setMinimumSectionSize(100);m_pTableView->horizontalHeader()->setDefaultAlignment(Qt::AlignCenter);m_pTableView->verticalHeader()->setDefaultAlignment(Qt::AlignCenter);m_pTableView->setModel(m_pSqlRelationalTableModel);for(int i = 0; i < m_tSerialisationList.size(); i++){if(m_tSerialisationList.at(i).eType == eDateTime){m_pTableView->setItemDelegateForColumn(i, new QDateTimeItemDelegate(m_qsDateFormat));}}m_pTableView->setItemDelegate(new QSqlRelationalDelegate(m_pTableView));m_pSqlRelationalTableModel->setTable(m_qsTableName);m_pSqlRelationalTableModel->setEditStrategy(QSqlTableModel::OnManualSubmit);//编辑后需要Submit才能更改for(int i = 0; i < m_headList.size(); i++){m_pSqlRelationalTableModel->setHeaderData(m_pSqlRelationalTableModel->fieldIndex(m_headList.at(i)), Qt::Horizontal, m_headListTitle.at(i));}m_pSqlRelationalTableModel->select();}
}template<typename TEMP>
QSqlRelationalTableModelEx *QSqlRelationalTableModelView<TEMP>::GetModel()
{return m_pSqlRelationalTableModel;
}template<typename TEMP>
void QSqlRelationalTableModelView<TEMP>::SetMode(bool bAdd, bool bDel, bool bUpdate)
{if(m_pViewObject != nullptr){m_pViewObject->SetMode(bAdd, bDel, bUpdate);}
}template<typename TEMP>
void QSqlRelationalTableModelView<TEMP>::SetSortingEnabled(bool enable)
{if (m_pTableView != nullptr) {m_pTableView->setSortingEnabled(enable);m_pTableView->horizontalHeader()->setSortIndicator(0, Qt::AscendingOrder);}
}template<typename TEMP>
void QSqlRelationalTableModelView<TEMP>::AddAction(QAction *pAction)
{if(m_pViewObject != nullptr){m_pViewObject->AddAction(pAction);}
}template<typename TEMP>
QSqlTableModel *QSqlRelationalTableModelView<TEMP>::RelationModel(int column)
{if(m_pSqlRelationalTableModel != nullptr){return m_pSqlRelationalTableModel->relationModel(column);}return nullptr;
}template<typename TEMP>
QTableView *QSqlRelationalTableModelView<TEMP>::GetRelationTableView(int column)
{QSqlRelationalTableModelView* pSqlRelationalTableModelView = findAndCreatRelationalTableModelView(column);if(pSqlRelationalTableModelView != nullptr){return pSqlRelationalTableModelView->GetTableView();}return nullptr;
}template<typename TEMP>
QSqlRelationalTableModelEx *QSqlRelationalTableModelView<TEMP>::GetRelationModel(int column)
{QSqlRelationalTableModelView* pSqlRelationalTableModelView = findAndCreatRelationalTableModelView(column);if(pSqlRelationalTableModelView != nullptr){return pSqlRelationalTableModelView->GetModel();}return nullptr;
}template<typename TEMP>
void QSqlRelationalTableModelView<TEMP>::SetRelationModelHead(int column, const QString qsHead, const QString qsHeadTitle, const QColor &colorCol)
{QSqlRelationalTableModelView* pSqlRelationalTableModelView = findAndCreatRelationalTableModelView(column);if(pSqlRelationalTableModelView != nullptr){pSqlRelationalTableModelView->SetSerialisationHead(qsHead, qsHeadTitle, TSerialisation(eInt, sizeof(int))/*序列化无效,做SQL查询用*/, colorCol);}
}template<typename TEMP>
void QSqlRelationalTableModelView<TEMP>::InitRelationView(int column)
{QSqlRelationalTableModelView* pSqlRelationalTableModelView = findAndCreatRelationalTableModelView(column);if(pSqlRelationalTableModelView != nullptr && pSqlRelationalTableModelView->GetModel() != nullptr && pSqlRelationalTableModelView->GetTableView() != nullptr){pSqlRelationalTableModelView->GetTableView()->setAlternatingRowColors(true);pSqlRelationalTableModelView->GetTableView()->setContextMenuPolicy(Qt::CustomContextMenu);pSqlRelationalTableModelView->GetTableView()->setSelectionBehavior(QAbstractItemView::SelectRows);//        pSqlRelationalTableModelView->GetTableView()->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);//自适应宽度pSqlRelationalTableModelView->GetTableView()->horizontalHeader()->setMinimumSectionSize(100);pSqlRelationalTableModelView->GetTableView()->horizontalHeader()->setDefaultAlignment(Qt::AlignCenter);pSqlRelationalTableModelView->GetTableView()->verticalHeader()->setDefaultAlignment(Qt::AlignCenter);pSqlRelationalTableModelView->GetTableView()->setModel(pSqlRelationalTableModelView->GetModel());for(int i = 0; i < pSqlRelationalTableModelView->getSerialisationList().size(); i++){if(pSqlRelationalTableModelView->getSerialisationList().at(i).eType == eDateTime){pSqlRelationalTableModelView->GetTableView()->setItemDelegateForColumn(i, new QDateTimeItemDelegate(pSqlRelationalTableModelView->getDateFormat()));}}pSqlRelationalTableModelView->GetTableView()->setItemDelegate(new QSqlRelationalDelegate(pSqlRelationalTableModelView->GetTableView()));pSqlRelationalTableModelView->GetModel()->setTable(pSqlRelationalTableModelView->getTableName());pSqlRelationalTableModelView->GetModel()->setEditStrategy(QSqlTableModel::OnManualSubmit);//编辑后需要Submit才能更改for(int i = 0; i < pSqlRelationalTableModelView->getHeadList().size(); i++){pSqlRelationalTableModelView->GetModel()->setHeaderData(pSqlRelationalTableModelView->GetModel()->fieldIndex(pSqlRelationalTableModelView->getHeadList().at(i)), Qt::Horizontal, pSqlRelationalTableModelView->getHeadListTitle().at(i));}pSqlRelationalTableModelView->GetModel()->select();}
}template<typename TEMP>
void QSqlRelationalTableModelView<TEMP>::SetRelationMode(int column, bool bAdd, bool bDel, bool bUpdate)
{QSqlRelationalTableModelView* pSqlRelationalTableModelView = findAndCreatRelationalTableModelView(column);if(pSqlRelationalTableModelView != nullptr){pSqlRelationalTableModelView->SetMode(bAdd, bDel, bUpdate);}
}template<typename TEMP>
void QSqlRelationalTableModelView<TEMP>::SetRelationSortingEnabled(int column, bool enable)
{QSqlRelationalTableModelView* pSqlRelationalTableModelView = findAndCreatRelationalTableModelView(column);if(pSqlRelationalTableModelView != nullptr){pSqlRelationalTableModelView->SetSortingEnabled(enable);}
}template<typename TEMP>
void QSqlRelationalTableModelView<TEMP>::AddRelationAction(int column, QAction *pAction)
{QSqlRelationalTableModelView* pSqlRelationalTableModelView = findAndCreatRelationalTableModelView(column);if(pSqlRelationalTableModelView != nullptr){pSqlRelationalTableModelView->AddAction(pAction);}
}template<typename TEMP>
QTableView *QSqlRelationalTableModelView<TEMP>::GetTableView()
{return m_pTableView;
}template<typename TEMP>
void QSqlRelationalTableModelView<TEMP>::SetRelation(int column, const QString &aTableName, const QString &indexCol,const QString &displayColconst, const QColor &colorCol)
{if(m_pSqlRelationalTableModel != nullptr){m_pSqlRelationalTableModel->setRelation(column, QSqlRelation(aTableName, indexCol, displayColconst));m_pSqlRelationalTableModel->InsertRelationTextColorMap(column, colorCol);}
}template<typename TEMP>
bool QSqlRelationalTableModelView<TEMP>::SQL_Init(QString csUser, QString csPasswd, QString csDB, QString csHost, int nPort)
{m_pMySqlOper->SQL_SetPro(csUser, csPasswd, csDB, csHost, nPort);return m_pMySqlOper->SQL_Connect();
}template<typename TEMP>
void QSqlRelationalTableModelView<TEMP>::SetSerialisationHead(const QString qsHead, const QString qsHeadTitle, TSerialisation tSerialisation, const QColor &colorCol)
{m_headList.append(qsHead);m_headListTitle.append(qsHeadTitle);m_tSerialisationList.append(tSerialisation);GetModel()->AppendcolTextColorList(colorCol);
}template<typename TEMP>
char *QSqlRelationalTableModelView<TEMP>::SQL_QuerySerialisation(QString csSql, int& nQuerySize, QList<TSerialisation> tSerialisationList)
{return m_pMySqlOper->SQL_QuerySerialisation(csSql, nQuerySize, tSerialisationList);
}template<typename TEMP>
QList<TEMP> QSqlRelationalTableModelView<TEMP>::SQL_QueryData(QString csSql)
{int nQuerySize = 0;char* p = m_pMySqlOper->SQL_QuerySerialisation(csSql, nQuerySize, m_tSerialisationList);QList<TEMP> resultList;if(p != nullptr && nQuerySize > 0){TEMP* pTemp = (TEMP*)p;for(int i = 0; i < nQuerySize; i++){TEMP temp;memcpy(&temp, &pTemp[i], sizeof (TEMP));resultList.append(temp);}delete [] p;}return resultList;
}template<typename TEMP>
void QSqlRelationalTableModelView<TEMP>::SetDateTimeFormat(QString qsDateFormat)
{m_qsDateFormat  = qsDateFormat;
}
#endif // QSQLRELATIONALTABLEMODELVIEW_H
//使用方法
//xxx.h
#pragma pack(push,1)//按字节对齐beginstruct tTemp{int id;int EInt;float EFloat;double EDouble;qint64 EDateTime;
};struct tTempJoin{int id;char EString1[255];char EString2[255];double EDouble;qint64 EDateTime;
};
#pragma pack(pop)//按字节对齐endprivate:QSqlRelationalTableModelView<tTemp>* m_pSqlRelationalTableModelView;//xxx.cpp
static bool bCreat = false;if(!bCreat){/*表结构CREATE TABLE `ModelTest` (`id` int NOT NULL AUTO_INCREMENT,`EInt` int NOT NULL,`EFloat` float NOT NULL,`EDouble` double NOT NULL,`EDateTime` datetime NOT NULL,PRIMARY KEY (`id`),KEY `name` (`EInt`) USING BTREE,KEY `name2` (`EFloat`),CONSTRAINT `name` FOREIGN KEY (`EInt`) REFERENCES `DICT` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,CONSTRAINT `name2` FOREIGN KEY (`EFloat`) REFERENCES `DICT2` (`id`));CREATE TABLE `DICT` (`id` int NOT NULL,`name` varchar(255) NOT NULL,KEY `id` (`id`));CREATE TABLE `DICT2` (`id` float NOT NULL,`name` varchar(255) NOT NULL,KEY `id` (`id`))*/m_pSqlRelationalTableModelView = new QSqlRelationalTableModelView<tTemp>("ModelTest", true);m_pSqlRelationalTableModelView->SQL_Init("root", "0000", "RadioMonitor");m_pSqlRelationalTableModelView->SetSerialisationHead("id", "序号", TSerialisation(eInt, sizeof(int)));m_pSqlRelationalTableModelView->SetSerialisationHead("EInt", "Int值", TSerialisation(eInt, sizeof(int)));m_pSqlRelationalTableModelView->SetSerialisationHead("EFloat", "Float值", TSerialisation(eFloat, sizeof(float)));m_pSqlRelationalTableModelView->SetSerialisationHead("EDouble", "Double值", TSerialisation(eDouble, sizeof(double)));m_pSqlRelationalTableModelView->SetSerialisationHead("EDateTime", "DateTime值", TSerialisation(eDateTime, sizeof(qint64)));m_pSqlRelationalTableModelView->InitView();m_pSqlRelationalTableModelView->SetRelation(1, "DICT","id","name", QColor(0, 255, 0));m_pSqlRelationalTableModelView->SetRelation(2, "DICT2","id","name", QColor(255, 255, 0));m_pSqlRelationalTableModelView->GetTableView()->resize(600, 300);m_pSqlRelationalTableModelView->SetMode(true, true, true);m_pSqlRelationalTableModelView->SetSortingEnabled(true);m_pSqlRelationalTableModelView->GetTableView()->setWindowTitle("数据库示例");//创建外键表1m_pSqlRelationalTableModelView->SetRelationModelHead(1, "id", "序号");m_pSqlRelationalTableModelView->SetRelationModelHead(1, "name", "名称");m_pSqlRelationalTableModelView->InitRelationView(1);m_pSqlRelationalTableModelView->GetRelationTableView(1)->resize(300, 150);m_pSqlRelationalTableModelView->SetRelationMode(1, true, true, true);m_pSqlRelationalTableModelView->SetRelationSortingEnabled(1, true);m_pSqlRelationalTableModelView->GetRelationTableView(1)->setWindowTitle("外键表1示例");//m_pSqlRelationalTableModelView->GetRelationModel(1)->setFilter("id=1");//设置过滤//创建外键表2m_pSqlRelationalTableModelView->SetRelationModelHead(2, "id", "序号");m_pSqlRelationalTableModelView->SetRelationModelHead(2, "name", "名称");m_pSqlRelationalTableModelView->InitRelationView(2);m_pSqlRelationalTableModelView->GetRelationTableView(2)->resize(300, 150);m_pSqlRelationalTableModelView->SetRelationMode(2, true, true, true);m_pSqlRelationalTableModelView->SetRelationSortingEnabled(2, true);m_pSqlRelationalTableModelView->GetRelationTableView(2)->setWindowTitle("外键表2示例");//m_pSqlRelationalTableModelView->GetRelationModel(2)->setFilter("id=1");//设置过滤//自定义右键菜单QAction *pAction1= new QAction("外键列表1示例", this);connect(pAction1, &QAction::triggered, this, [&] {const QRect screen = QGuiApplication::screens().at(0)->geometry();m_pSqlRelationalTableModelView->GetRelationTableView(1)->move(screen.center() - m_pSqlRelationalTableModelView->GetRelationTableView(1)->rect().center());m_pSqlRelationalTableModelView->GetRelationTableView(1)->show();});m_pSqlRelationalTableModelView->AddAction(pAction1);QAction *pAction2= new QAction("外键列表2示例", this);connect(pAction2, &QAction::triggered, this, [&] {const QRect screen = QGuiApplication::screens().at(0)->geometry();m_pSqlRelationalTableModelView->GetRelationTableView(2)->move(screen.center() - m_pSqlRelationalTableModelView->GetRelationTableView(1)->rect().center());m_pSqlRelationalTableModelView->GetRelationTableView(2)->show();});m_pSqlRelationalTableModelView->AddAction(pAction2);const QRect screen = QGuiApplication::screens().at(0)->geometry();m_pSqlRelationalTableModelView->GetTableView()->move(screen.center() - m_pSqlRelationalTableModelView->GetTableView()->rect().center());//默认查询,SQL语句需返回本表所有字段且不含其他表字段QList<tTemp> list= m_pSqlRelationalTableModelView->SQL_QueryData("SELECT * FROM ModelTest LIMIT 0,100");qDebug() << list.size();//INNER JOIN查询 或者 LEFT JOIN查询QList<TSerialisation> tSerialisationList;tSerialisationList << TSerialisation(eInt, sizeof(int));tSerialisationList << TSerialisation(eString, 255);tSerialisationList << TSerialisation(eString, 255);tSerialisationList << TSerialisation(eDouble, sizeof(double));tSerialisationList << TSerialisation(eDateTime, sizeof(qint64));int nQuerySize = 0;tTempJoin* ptTempJoin= (tTempJoin*)m_pSqlRelationalTableModelView->SQL_QuerySerialisation("SELECT a.id, b.name, c.name, a.EDouble, a.EDateTime FROM ModelTest a INNER JOIN DICT b, DICT2 c LIMIT 0,100", nQuerySize, tSerialisationList);if(nQuerySize > 1)qDebug() << nQuerySize << ptTempJoin[0].EString1 << ptTempJoin[0].EString2;elseqDebug() << nQuerySize;}m_pSqlRelationalTableModelView->GetTableView()->show();bCreat = true;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/97301.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ARM Linux 系统稳定性分析入门及渐进12 -- GDB内存查看命令 “x“(examine)】

文章目录 gdb 内存查看命令 examine 上篇文章&#xff1a;ARM Linux 系统稳定性分析入门及渐进11 – GDB( print 和 p 的使用| 和 &#xff1a;&#xff1a;的使用|ptype|{&#xff1c;type&#xff1e;} &#xff1c;addr&#xff1e; ) gdb 内存查看命令 examine examine是…

【数据结构】如何用队列实现栈?图文详解(LeetCode)

LeetCode链接&#xff1a;225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09; 本文默认读者已经掌握栈与队列的基本知识 或者先看我的另一篇博客&#xff1a;【数据结构】栈与队列_字节连结的博客-CSDN博客 做题思路 由于我们使用的是C语言&#xff0c;不能直接使用队…

​Kubernetes的演变:从etcd到分布式SQL的过渡

DevRel领域专家Denis Magda表示&#xff0c;他偶然发现了一篇解释如何用PostgreSQL无缝替换etcd的文章。该文章指出&#xff0c;Kine项目作为外部etcd端点&#xff0c;可以将Kubernetes etcd请求转换为底层关系数据库的SQL查询。 受到这种方法的启发&#xff0c;Magda决定进一步…

react-native-webview RN和html双向通信

rn登录后得到的token需要传递给网页&#xff0c;js获取到的浏览器信息需要传递给rn RN Index.js: import React from react import { WebView } from react-native-webview import useList from ./useListexport default function Index(props) {const { uri, jsCode, webVie…

【MySQL系列】--初识数据库

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

在ubuntu中将dict.txt导入到数据库sqlite3

将dict.txt导入到数据库 #include <head.h> #include <sqlite3.h> int do_insert(int i,char *str,sqlite3 *db); int main(int argc, const char *argv[]) {//创建泵打开一个数据库sqlite3 *db NULL;if(sqlite3_open("./my.db",&db) ! SQLITE_OK){…

使用IDM下载视频出现“由于法律原因,IDM无法下载...

一、问题描述 由于法律原因,IDM无法下载..,如图: 二、原因分析 下载该IDM抓取的M3U8文件,查看其中的内容发现 : #EXT-X-KEY 字段已经写明了加密方式是AES-128,包含一个URI和IV值 #EXTM3U #EXT-X-VERSION:3 #EXT-X-TARGETDURATION:8 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-KEY:…

Cpp学习——list的模拟实现

目录 一&#xff0c;实现list所需要包含的三个类 二&#xff0c;三个类的实现 1.list_node 2.list类 3.iterator_list类 三&#xff0c;功能实现 1.list类里的push_back() 2.iterator类里的运算符重载 3&#xff0c;list类里面的功能函数 1.insert&#xff08;&#xff…

2023国赛数学建模思路 - 案例:FPTree-频繁模式树算法

文章目录 算法介绍FP树表示法构建FP树实现代码 建模资料 ## 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法&#xff0c;就是频繁模式树算法&#xff0c…

Linux常用命令——dig命令

在线Linux命令查询工具 dig 域名查询工具 补充说明 dig命令是常用的域名查询工具&#xff0c;可以用来测试域名系统工作是否正常。 语法 dig(选项)(参数)选项 <服务器地址>&#xff1a;指定进行域名解析的域名服务器&#xff1b; -b<ip地址>&#xff1a;当主…

Log4net在.Net Winform项目中的使用

引言&#xff1a; Log4net是一个流行的日志记录工具&#xff0c;可以帮助开发人员在应用程序中实现高效的日志记录。本文将提供一个详细的分步骤示例&#xff0c;来帮助您在.Net Winform项目中使用Log4net。 目录 一、安装Log4net二、配置Log4net三、在项目中使用Log4net四、初…

深入探索:Kali Linux 网络安全之旅

目录 前言 访问官方网站 导航到下载页面 启动后界面操作 前言 "Kali" 可能指的是 Kali Linux&#xff0c;它是一种基于 Debian 的 Linux 发行版&#xff0c;专门用于渗透测试、网络安全评估、数字取证和相关的安全任务。Kali Linux 旨在提供一系列用于测试网络和…

uniapp的uview-plus组件库的导入

uniapp的vue3中使用uview-plus组件库。在插件市场中找到该组件并点击如下所示绿色按钮&#xff0c;弹出弹窗选择要导入的项目后&#xff0c;就会在uni_modules文件中生成如下文件内容 关于插件的下载区别&#xff0c;可参考&#xff1a;https://uniapp.dcloud.net.cn/compone…

回归预测 | MATLAB实现SSA-SVM麻雀搜索算法优化支持向量机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现SSA-SVM麻雀搜索算法优化支持向量机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现SSA-SVM麻雀搜索算法优化支持向量机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览基…

(三)行为型模式:3、解释器模式(Interpreter Pattern)(C++示例)

目录 1、解释器模式&#xff08;Interpreter Pattern&#xff09;含义 2、解释器模式的UML图学习 3、解释器模式的应用场景 4、解释器模式的优缺点 5、C实现解释器模式的实例 1、解释器模式&#xff08;Interpreter Pattern&#xff09;含义 解释器模式&#xff08;Interp…

《TCP IP网络编程》第二十四章

第 24 章 制作 HTTP 服务器端 24.1 HTTP 概要 本章将编写 HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;服务器端&#xff0c;即 Web 服务器端。 理解 Web 服务器端&#xff1a; web服务器端就是要基于 HTTP 协议&#xff0c;将网页对…

C语言刷题指南(二)

&#x1f4d9;作者简介&#xff1a; 清水加冰&#xff0c;目前大二在读&#xff0c;正在学习C/C、Python、操作系统、数据库等。 &#x1f4d8;相关专栏&#xff1a;C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 &#x1f44d…

设计模式 : 单例模式笔记

文章目录 一.单例模式二.单例模式的两种实现方式饿汉模式懒汉模式 一.单例模式 一个类只能创建一个对象,这样的类的设计模式就称为单例模式,该模式保证系统中该类只能有一个实例(并且父子进程共享),一个很典型的单例类就是CSTL的内存池C单例模式的基本设计思路: 私有化构造函数…

vector

1.vector的介绍及使用 vector的文档介绍 1. vector是表示可变大小数组的序列容器。 2. 就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c;它的大小是可…