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.pswp.cn/news/39264.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/39264.shtml
英文地址,請注明出處:http://en.pswp.cn/news/39264.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于VUE3+Layui從頭搭建通用后臺管理系統(前端篇)九:自定義組件封裝下

一、本章內容 續上一張,本章實現一些自定義組件的封裝,包括文件上傳組件封裝、級聯選擇組件封裝、富文本組件封裝等。 1. 詳細課程地址: 待發布 2. 源碼下載地址: 待發布 二、界面預覽 三、開發視頻 基于VUE3+Layui從頭搭建通用后臺管

【軟件工程】內聚

概念 是指一個模塊內部個成分之間相互關聯程度的度量。也就是說&#xff0c;凝聚是對模塊內各處理動作組合強度的一種度量。很顯然&#xff0c;一個模塊的內聚越大越好。 偶然凝聚 一個模塊內的各處理元素之間沒有任何聯系&#xff0c;只是偶然地被湊到一起。這種模塊也稱為…

mov轉mp4格式怎么轉?

mov轉mp4格式怎么轉&#xff1f;眾所周知&#xff0c;MOV視頻格式是由蘋果公司推出的常用的視頻格式&#xff0c;能夠在蘋果軟件及設備上使用。但是&#xff0c;如果將其應用于其他軟件和設備上的話&#xff0c;可能會遇到文件無法正常播放的情況。在這個時候&#xff0c;我們需…

Linux MQTT智能家居項目(LED界面的布局設置)

文章目錄 前言一、LED界面布局準備工作二、LED界面布局三、邏輯實現總結 前言 上篇文章我們完成了主界面的布局設置那么這篇文章我們就來完成各個界面的布局設置吧。 一、LED界面布局準備工作 首先添加LED燈光控制的圖標。 將選擇好的LED圖標添加進來&#xff1a; 圖標可以…

drawio導出矢量圖

1.選中要導出的圖 2.導出為pdf 3.用adobe打開pdf&#xff0c;另存為eps

華為認證含金量如何

華為認證是指通過華為技術有限公司官方認證考試所獲得的認證資格。華為認證主要分為三個級別&#xff1a;華為認證工程師&#xff08;HCIE&#xff09;、華為認證專家&#xff08;HCNP&#xff09;和華為認證技術專家&#xff08;HCNA&#xff09;&#xff0c;每個級別都有不同…

在測試環境進行sqlserver鎖表測試

將某表設置X鎖1分鐘&#xff1a; begin tran select top 1 * from tableName with (tablockx) waitfor delay 00:01:00 commit tran 查詢當前被鎖的表&#xff1a; --查詢鎖表的事務ID&#xff0c;被鎖表名&#xff0c;鎖模式&#xff0c;客戶端主機名&#xff0c;客戶端程序…

你真的了解數據結構與算法嗎?

數據結構與算法&#xff0c;是理論和實踐必須緊密結合的一門學科&#xff0c;有關數據結構和算法同類的課程或書籍&#xff0c;有些只是名為“數據結構”&#xff0c;而非“數據結構與算法”&#xff0c;它們在內容上并無很大區別。 實際上&#xff0c;數據結構和算法&#xf…

【華為認證 Datacom 練習題(有答案喲)】

1&#xff08;單選題&#xff09;下列配置默認路由的命令中&#xff0c;正確的是&#xff08;&#xff09;。 A、 B、 C、 D、 正確答案A 2&#xff08;單選題&#xff09;UDP是面向無連接的&#xff0c;必須使用&#xff08;&#xff09;來提供傳輸的可靠性。 A、網絡層…

深入源碼分析kubernetes informer機制(零)簡單了解informer

[閱讀指南] 基于kubernetes 1.27 stage版本 為了方便閱讀&#xff0c;后續所有代碼均省略了錯誤處理及與關注邏輯無關的部分。 文章目錄 關于client-goInformer是什么為什么需要informerInformer工作流程后續分析計劃 關于client-go client-go是kubernetes節點與服務端進行資源…

揭秘熱門工作秘籍:ChatGPT大顯身手!輕松提升工作效率的高效Prompt技巧曝光!

目錄 01 背景 福利&#xff1a;文末有chat-gpt純分享&#xff0c;無魔法&#xff0c;無限制 02 AI 可以幫助程序員做什么&#xff1f; 2.1 技術知識總結 2.2 拆解任務 2.3 閱讀代碼/優化代碼 2.4 代碼生成 2.5 生成單測 2.6 更多 AI 應用/插件 AIPRM Voice Control for Ch…

2023企業微信0day漏洞復現以及處理意見

2023企業微信0day漏洞復現以及處理意見 一、 漏洞概述二、 影響版本三、 漏洞復現小龍POC檢測腳本: 四、 整改意見 免責聲明&#xff1a;請勿利用文章內的相關技術從事非法測試&#xff0c;由于傳播、利用此文所提供的信息或者工具而造成的任何直接或者間接的后果及損失&#x…

論文閱讀:《Waymo Public Road Safety Performance Data》

文章目錄 1 背景2 方法2.1 數據來源2.2 碰撞數據 3 碰撞事件分析4 討論 1 背景 這篇文章是講waymo道路安全性能數據分析的&#xff0c;主要想表達的是waymo自動駕駛系統在安全上面的出色表現&#xff0c;以向政府、大眾提高自己產品的公信力。 這篇文章分析的數據是自從2019年到…

Django圖書商城系統實戰開發 - 實現會員管理

Django圖書商城系統實戰開發 - 實現會員管理 在Django圖書商城系統中&#xff0c;會員管理是一個重要的功能模塊。該模塊包括會員信息的展示、編輯和刪除等功能。以下是實現會員管理功能的詳細步驟和代碼示例。 步驟一&#xff1a;設計數據庫模型 首先&#xff0c;我們需要設…

Transactional注解的方法中數據庫和redis的回滾問題

問題背景&#xff1a;如果某個方法加了Transactional注解&#xff0c;而這個方法中既包括mysql事務又包括redis事務&#xff0c;那么如何做到mysql和redis都回滾&#xff1f; mysql事務支持回滾&#xff0c;但redis的事務是不支持回滾的&#xff0c;但它倆都在當前方法的事務里…

MySQL高階知識點(一)事務的并發問題和隔離級別

簡單來說&#xff0c;事務就是要保證一組數據庫操作&#xff0c;要么全部成功&#xff0c;要么全部失敗。 在 MySQL 中&#xff0c;事務支持是在引擎層實現的。 MySQL 是一個支持多引擎的系統&#xff0c;但并不是所有的引擎都支持事務。 如 MySQL 原生的 MyISAM 引擎就不支持…

MBR400100CT-ASEMI肖特基模塊MBR400100CT

編輯&#xff1a;ll MBR400100CT-ASEMI肖特基模塊MBR400100CT 型號&#xff1a;MBR400100CT 品牌&#xff1a;ASEMI 封裝&#xff1a;M2 正向電流&#xff1a;400A 反向電壓&#xff1a;100V 引線數量&#xff1a;2 芯片個數&#xff1a;2 芯片尺寸&#xff1a;102MIL…

Django 初級指南:創建你的第一個 Django 項目

Django 是一個強大的 Python Web 框架&#xff0c;它采用了“模型-視圖-控制器”&#xff08;MVC&#xff09;的設計模式&#xff0c;能夠幫助開發者快速、簡潔地創建高質量的 Web 應用。這篇文章將引導你創建你的第一個 Django 項目。 一、安裝 Django 首先&#xff0c;你需…

OpenCV-Python中的圖像處理-霍夫變換

OpenCV-Python中的圖像處理-霍夫變換 霍夫變換霍夫直線變換霍夫圓環變換 霍夫變換 霍夫(Hough)變換在檢測各種形狀的技術中非常流行&#xff0c;如果要檢測的形狀可以用數學表達式描述&#xff0c;就可以是使用霍夫變換檢測它。即使要檢測的形狀存在一點破壞或者扭曲也是可以使…

【1day】復現大華智慧園區綜合管理平臺SQL注入漏洞

目錄 一、漏洞描述 二、影響版本 三、資產測繪 四、漏洞復現 一、漏洞描述 大華智慧園區綜合管理平臺是一個集智能化、信息化、網絡化、安全化為一體的智慧園區管理平臺,旨在為園區提供一站式解決方案,包括安防、能源管理、環境監測、人員管理、停車管理等多個方面。大華…