weixin_58241990
2021-06-08 18:04
采纳率: 85.7%
浏览 27

QT中 手动触发一个信号,已经建立的有信号链接,但是对于的槽信号没有动作

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
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • qfl_sdu 2021-06-08 18:24
    已采纳

    void myDb::selectIPTableValues()//获取IP表内数据

    在这个函数的开头加个打印,看看信号是否接收到了。如果没接收到,就说明是connect那里有问题,检查一下是否有拼写错误。

    还有就是看看.h里面,void selectIPTableValues()是不是在public slots:下面

    打赏 评论
  • weixin_58241990 2021-06-08 19:15

    我现在在想,如果去掉刚刚增加的按钮,把操作db的类放到线程中去处理,还会不会有这个问题

     好吧,使用线程还是不可以  确实不太清楚哪里的问题造成的 ,第一次运行就不会触发这个槽动作。手动点击按钮可以触发。

    请问那个大佬能帮忙解决下这个问题呢

    打赏 评论
  • weixin_58241990 2021-06-08 21:07

    好吧,我真的是个小白。

    这个问题我已经找到了。

    //查询IP表数据
        connect(this,&ipsetwindow::startSelDBIP,m_DB,&myDb::selectIPTableValues);
        //查询完毕后给出查询到的数据
        connect(m_DB,&myDb::selectIPTableValueOver,this,&ipsetwindow::getIPdbTableValue);
        connect(m_DB,&myDb::selectIPTableValueOver,this,&ipsetwindow::setMyTableValue);
    
        //查询IP表内数据
        connect(this,&ipsetwindow::getIPTableValues,this,&ipsetwindow::startMyDBConnced);
    
        //鼠标选中一行后,返回获得的那一行
        connect(ui->tableWidget,&QTableWidget::cellClicked,this,&ipsetwindow::endTable);
        //插入IP数据
        connect(this,&ipsetwindow::insertIPTableValue,m_DB,&myDb::inserIPTableValue);
        connect(this,&ipsetwindow::destroyed,this,&ipsetwindow::closeWindowDist);
    
        m_RowCount = m_DB->selectCountRowDB();//查询数据库获得有多少行数据
        setMyTableRow(m_RowCount);//表格初始化

    看到这个代码和上面的区别了吗(不必关注代码中信号不一致,这是我在查找问题时新建立的,只需要关注顺序即可)。

    在修改这个代码之前,我的槽与信号的连接是在手动触发之后才建立的。

    在运行代码的时候,槽函数没有输出debug是因为我的信号触发太早啦(还没有建立连接就触发了)。

    希望各位新手看到我这个问题的时候可以引起注意。不要犯这样的错误,不然会头疼的。

    打赏 评论

相关推荐 更多相似问题