1、有两个类对象
一个是操作SQLite数据库
一个是界面显示TableWidget
问题:
在界面显示的类中建立连接
connect(this,&ipsetwindow::getIPTableValue,m_DB,&myDb::selectIPTableValues);
手动触发信号
在此处有手动emit ,但是在没有正确执行
触发查询表内数据后 在此处有一次触发信号,用该信号来调用查询到的数据,并在界面中展示
在实际程序中 并没有收到该信号。
下图为代码执行截图,且表内有一条数据:
但是同样的写法,触发DB类执行插入语句的槽确可以执行:
//DB数据库操作类
#include "mydb.h"
#include <QMessageBox>
//sqliteDb
myDb::myDb(QObject *parent) : QObject(parent)
{
m_Query = NULL;
this->m_IPTableName = "clientIP";
this->m_UserTableName = "user";
conDataba(m_DB_Sqlite);//创建必要表
}
myDb::~myDb()
{
m_DB_Sqlite.close();
if(m_Query != NULL)
{
delete m_Query;
m_Query = NULL;
}
}
void myDb::conDataba(QSqlDatabase &myDB)//连接DB
{
if(!myDB.isValid())//如果没有连接驱动,则连接
{
myDB = QSqlDatabase::addDatabase("QSQLITE");//连接驱动
}
QString myDBName = myDB.databaseName();//获取连接的数据库名
if(myDBName.isEmpty())
{
myDB.setDatabaseName("WeiLong.db");//设置数据库名
}
if(!myDB.open())//如果没有打开数据库 则打开
{
myDB.open();
}
m_Query = new QSqlQuery(myDB);
QString Sqlstring = "create table if not exists user(userid varchar(20),password varchar(20));";//创建用户表
bool ex = m_Query->exec(Sqlstring);
if(!ex)
qDebug()<<"创建用户表错误 33"<<m_Query->lastError().text();
//创建IP表
Sqlstring = "create table if not exists clientIP(name varchar(50),addressIP varchar(50) primary key,addressHost varchar(50),systemTime text);";
m_Query->exec(Sqlstring);
if(!ex)
qDebug()<<"创建IP表错误"<<m_Query->lastError().text();
}
int myDb::selectCountRowDB()//查询表内有多少个数据并返回信息
{
qint16 myCount = 0;
QString Sqlstring = QString("select count(*) from %1 ").arg(m_IPTableName);
if(m_Query!=NULL)
{
if(m_Query->exec(Sqlstring))//查询有多少个数据
{
m_Query->next();
myCount = m_Query->value(0).toInt();
}
else
{
qDebug()<<"db错误信息:63"<<m_Query->lastError().text();
}
}
return myCount;
}
void myDb::selectIPTableValues()//获取IP表内数据
{
QString Sqlstring = QString("select * from %1 ").arg(m_IPTableName);
if(m_Query!= NULL)
{
if(m_Query->exec(Sqlstring))
{
while(m_Query->next())
{
m_NameValueTable += m_Query->value("name").toStringList();
m_AddressValueTable += m_Query->value("addressIP").toStringList();
m_addressHostValueTable += m_Query->value("addressHost").toStringList();
}
emit selectIPTableValueOver();//数据查询完毕
qDebug()<<"获取IP表内数据 ";
}
}
}
void myDb::inserIPTableValue(const QStringList li)//插入IP表数据
{
if(m_Query!= NULL)
{
if(li.isEmpty())
{
return ;
}
QString Sqlstring = QString("insert into %1 values('%2','%3','%4','%5');").arg(m_IPTableName).arg(li.at(0)).arg(li.at(1)).arg(li.at(2)).arg(li.at(3));
if(!m_Query->exec(Sqlstring))
qDebug()<<"插入的字符串"<<Sqlstring<<m_Query->lastError().text();
}
return ;
}
QStringList myDb::getTableName()
{
return this->m_NameValueTable;
}
QStringList myDb::getTabAddress()
{
return this->m_AddressValueTable;
}
QStringList myDb::getTabHost()
{
return this->m_addressHostValueTable;
}
界面显示类:
#include "ipsetwindow.h"
#include "ui_ipsetwindow.h"
#include <QDebug>
#include <QStringList>
#include <QTableWidgetItem>
ipsetwindow::ipsetwindow(QWidget *parent) :
QWidget(parent),
ui(new Ui::ipsetwindow)
{
ui->setupUi(this);
m_NowClickRow = 0;
m_NowClickColn = 0;
setMyWindowTitle();//设置窗口标题
m_DB = NULL;
m_DB = new myDb();
m_RowCount = m_DB->selectCountRowDB();//查询数据库获得有多少行数据
setMyTableRow(m_RowCount);//表格初始化
//查询IP表数据
connect(this,&ipsetwindow::getIPTableValue,m_DB,&myDb::selectIPTableValues);
//查询完毕后给出查询到的数据
connect(m_DB,&myDb::selectIPTableValueOver,this,&ipsetwindow::getIPdbTableValue);
connect(m_DB,&myDb::selectIPTableValueOver,this,&ipsetwindow::setMyTableValue);
//鼠标选中一行后,返回获得的那一行
connect(ui->tableWidget,&QTableWidget::cellClicked,this,&ipsetwindow::endTable);
//插入IP数据
connect(this,&ipsetwindow::insertIPTableValue,m_DB,&myDb::inserIPTableValue);
}
ipsetwindow::~ipsetwindow()
{
delete ui;
if(m_DB!= NULL)
{
delete m_DB;
m_DB = NULL;
}
}
void ipsetwindow::setMyTableRow(int rouCound)//设置表格的表头信息
{
m_NowRowCount = rouCound;//得到多少行
QStringList header;
header<<"设备信息"<<"IP地址" <<"端口号";
ui->tableWidget->setColumnCount(3);//设置三列
ui->tableWidget->setHorizontalHeaderLabels(header);//设置列标题内容
//设置列宽
ui->tableWidget->setColumnWidth(0,250);
ui->tableWidget->setColumnWidth(1,250);
ui->tableWidget->setColumnWidth(2,150);
m_NowColunCount = ui->tableWidget->columnCount();//得到多少列
//如果没有数据
if(rouCound < 1)
{
return;
}
emit getIPTableValue();//数据库查询数据
qDebug()<<"emit getIPTableValue";
//m_DB->selectIPTableValues();
}
void ipsetwindow::setMyWindowTitle()//设置我的窗口信息
{
this->setWindowTitle("SelectIP");
this->resize(860,520);
}
void ipsetwindow::getIPdbTableValue()//得到IP表数据
{
this->m_TabName = m_DB->getTableName();
this->m_TabAdd = m_DB->getTabAddress();
this->m_TabHost = m_DB->getTabHost();
}
void ipsetwindow::setMyTableValue()//设置表格内信息
{
//设置行的信息
for(int i = 0; i < this->m_NowRowCount; i++)
{
ui->tableWidget->setItem(i,0,new QTableWidgetItem(this->m_TabName.at(i)));
ui->tableWidget->setItem(i,1,new QTableWidgetItem(this->m_TabAdd.at(i)));
ui->tableWidget->setItem(i,2,new QTableWidgetItem(this->m_TabHost.at(i)));
}
qDebug()<<"设置表格内信息"<<m_NowRowCount;
}
void ipsetwindow::endTable(int x,int y)//选中的行和列
{
this->m_NowClickRow = x;
this->m_NowClickColn = y;
}
void ipsetwindow::on_addNewBut_clicked()//点击新增按钮
{
//得到行数
//m_NowRowCount = ui->tableWidget->rowCount();
m_NowRowCount += 1;
ui->tableWidget->setRowCount(m_NowRowCount);
//ui->tableWidget->setItem(m_NowRowCount-1,0,new QTableWidgetItem("读码器工位1"));
}
void ipsetwindow::on_deleteBut_clicked()//点击删除按钮
{
qDebug()<<ui->tableWidget->rowCount();
if(m_NowRowCount>0)
{
m_NowRowCount -= 1;
ui->tableWidget->removeRow(m_NowRowCount);//移除表格中的多少行
}
}
void ipsetwindow::on_endBut_clicked()//确认修改的内容
{
bool ter = false;
if(m_NowRowCount>0)
{
for(int i = 0; i < this->m_NowColunCount; i++)
{
if(ui->tableWidget->item(m_NowClickRow,i)!= nullptr)
{
QString str = ui->tableWidget->item(m_NowClickRow,i)->text();
this->m_InsertTabValue += str;
if(i == m_NowColunCount-1)
ter = true;
}
else
{
QMessageBox::warning(this,"end update Error","value is NULL");
m_InsertTabValue.clear();
return;
}
}
if(ter)
{
QDateTime mytime = QDateTime::currentDateTime();
m_InsertTabValue += mytime.toString("yyyy-MM-dd hh:mm:ss");
emit insertIPTableValue(m_InsertTabValue);//触发数据库插入数据信号
m_InsertTabValue.clear();
}
}
}
萌新刚开始学习,求大佬解惑 感谢。
追加:
操作db类的头文件
#ifndef MYDB_H
#define MYDB_H
//sqliteDb
#pragma execution_character_set("utf-8")
#include <QObject>
#include <QDebug>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#include <QMessageBox>
class myDb : public QObject
{
Q_OBJECT
public:
explicit myDb(QObject *parent = nullptr);
~myDb();
void conDataba(QSqlDatabase &);//连接DB
int selectCountRowDB();//查询IP表内共有多少数据
void selectIPTableValues();//获取IP表内数据
void inserIPTableValue(const QStringList li);//插入IP表数据
QStringList getTableName();
QStringList getTabAddress();
QStringList getTabHost();
private:
QSqlDatabase m_DB_Sqlite;//数据库连接操作对象
QSqlQuery * m_Query;
QString m_IPTableName;
QString m_UserTableName;
QStringList m_NameValueTable;
QStringList m_AddressValueTable;
QStringList m_addressHostValueTable;
signals:
void selectIPTableValueOver();//查询IP表完毕
};
#endif // MYDB_H
报表显示类:
#ifndef IPSETWINDOW_H
#define IPSETWINDOW_H
#include <QWidget>
#include "mydb.h"
#include <QDateTime>
namespace Ui {
class ipsetwindow;
}
class ipsetwindow : public QWidget
{
Q_OBJECT
public:
explicit ipsetwindow(QWidget *parent = nullptr);
~ipsetwindow();
void selectCountRowValue();//查询数据库内有多少个数据并显示窗口内
void setMyTableRow(int rowCount);//设置表格表头内容
void setMyWindowTitle();//设置我的窗口信息
void getIPdbTableValue();//得到IP表数据
void setMyTableValue();//设置表格内信息
void endTable(int x,int y);//选中的行和列
private slots:
void on_addNewBut_clicked();
void on_deleteBut_clicked();
void on_endBut_clicked();
private:
Ui::ipsetwindow *ui;
myDb * m_DB;
int m_RowCount;//获得表内的行数
int m_NowRowCount;//当前行数
int m_NowColunCount;//当前列数
int m_NowClickRow;//选中的行数
int m_NowClickColn;//选中的列数
QStringList m_TabName;
QStringList m_TabAdd;
QStringList m_TabHost;
QStringList m_InsertTabValue;
signals:
void getIPTableValue();//得到IP表数据
void insertIPTableValue(const QStringList list);
};
#endif // IPSETWINDOW_H