前言
在需要庞大的数据量的系统中,基于合适的功能对数据进行观察和使用至关重要,本篇在自己项目实战的基础上,基于C++ QT编程语言,对其中一个数据功能进行分析和代码实现,希望可以有所帮助。一些特殊原因,图片有些内容无法展示,原理不变。
正文
01-功能演示
首先要在QT设计器中添加控件和表格,如下图所示,将控件放在合适的位置,然后选择合适的方法进行布局即可,操作比较简单。
如下图所示,运行之后,数据库还没有与表格中表头对应的参数名称进行匹配。但是表头中参数名称都是与下方控件一一对应的,这样才能保证选中时,可以在下方控件中查看所有信息。
如下图所示,这是数据匹配之后的结果,可以看出,该系统中,数据一直在更新,如果不去选择某一条,下方控件显示的一直是最新的一组数据,并且控件中的表更新按钮是选中的,也就是会一直更新。
如下图所示,当对某一条选中时,比如选中第5组数据,蓝色框线选中,此时,这一组的数据都会在下方对应控件中显示,意思就是如果表格中的表头名称是生产时间,那么对应数据可以显示在下方生产时间对应控件中。一一对应,清晰明了。
当然,对数据观察结束之后,不能一直处于这个状态,此时,点击表更新旁边的方框,使其处于选中状态,表格便会继续更新,而下方控件显示的数据也会重新变成最新一组数据。
至此,功能演示结束,下面是如何通过代码实现,分成两部分解释。
02-双击事件实现
具体代码如下,解释如下:
在QT中提供了用于实现双击事件的信号函数,doubleClicked(QModelIndex),
通常用于与视图类(如QTreeView、QListView、QTableView等)相关联的槽函数。在用户双击视图中的某个项目时,该信号就会被发射。
使用方法:
1、连接信号与槽函数
connect(ui->cgl_tblWidget, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(double_selected_action(QModelIndex)));
这里cgl_tblWidget
是表格名称,this
是槽函数所属的对象,double_selected_action
是要处理双击事件的槽函数。
2、定义槽函数
void MainWindow::double_selected_action(const QModelIndex &index)
{
}
3、原理
信号发射: 当用户在视图中双击某个项目时,视图会检测到这一事件,并在内部发射doubleClicked(QModelIndex)
信号。
信号连接: 通过connect
函数将该信号与特定的槽函数连接起来。这确保了当信号被发射时,相关联的槽函数会被调用。
槽函数执行: 当信号被发射时,Qt会自动调用与之连接的槽函数。槽函数中,可以访问双击的项目的QModelIndex
对象,以便进一步处理该事件。
QModelIndex
对象: 这是一个用于访问数据模型中项目的通用索引类。通过QModelIndex
,可以获取到被双击的项目的行号、列号等信息,以及项目的数据。
具体代码实现过程如下,代码详细介绍已经添加注释:
// 这里是mainwindow.h文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
/*#include "Mp_Pred.h"*/
#include"ui_mainwindow.h"
#include <QMainWindow>
#include <QLabel>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots :
void double_selected_action(const QModelIndex &index); //实现函数声明
}
// 这里是mainwindow.cpp文件
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "qdebug.h"
#include <qstring.h>
#include "cglobal.h"
#include <QDebug>
#include <QMessageBox>
#include <iostream>
#include <QFile>
#include <QFileDialog>
#include <memory>
#include <string>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 这里通过信号与槽函数实现双击QTableWidget中的某一行,其中的数据可以在对应的LineEdit中显示
connect(ui->cgl_tblWidget, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(double_selected_action(QModelIndex)));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::double_selected_action(const QModelIndex &index)
{
// 这里的AENTID是每组数据中对应的第一个数据,通过下面的方法,将其取出,然后放在控件中,需要使用时,进行修改成自己的即可
QString AENTID = ui->cgl_tblWidget->model()->index(index.row(), 0).data().toString();//使用一个字符串接收
ui->AENTID_QLE->setText(AENTID);//把这个字符串显示在相应的lineEdit控件上
QString ATIME = ui->cgl_tblWidget->model()->index(index.row(), 1).data().toString();
ui->ATIME_QLE->setText(ATIME);
QString ST_code = ui->cgl_tblWidget->model()->index(index.row(), 2).data().toString();
ui->ST_code_QLE->setText(ST_code);
QString ST_grade = ui->cgl_tblWidget->model()->index(index.row(), 3).data().toString();
ui->ST_grade_QLE->setText(ST_grade);
}
03-表格更新事件实现
这里的函数实现和上面函数存在关联,不能脱离,具体解释如下:
函数double_selected_action()也是上面的函数,这个函数保证执行双击事件之后,全局变量flag_system_updata等于1,也就是不再选中,
函数on_Update_Table_Box_stateChanged()保证选中QCheckBox之后,全局变量flag_system_updata等于0,表格继续更新。
函数data_input_result_view_update()用于读取数据库,保证不再选中QCheckBox之后,系统下方界面中的控件不再按照上方表格更新,数据便于观察。
// 这里是mainwindow.h文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
/*#include "Mp_Pred.h"*/
#include"ui_mainwindow.h"
#include <QMainWindow>
#include <QLabel>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots :
void on_Update_Table_Box_stateChanged(int arg1); // 是否选中QCheckBox槽函数声明
void MainWindow::data_input_result_view_update();
}
// 这里是mainwindow.cpp文件
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "qdebug.h"
#include <qstring.h>
#include "cglobal.h"
#include <QDebug>
#include <QMessageBox>
#include <iostream>
#include <QFile>
#include <QFileDialog>
#include <memory>
#include <string>
// 这里是定义了一个变量用于处理,工作模式 0:数据定时更新 1:选中卷信息
// 当然放在这里属于全局变量,但是将会占用大量空间,最好单独建立一个文件,用于放置这些全局变量,便于使用,
int flag_system_updata = 0;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 选中函数
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::double_selected_action(const QModelIndex &index)
{
// 当双击QTableWidget行时,则发送数据表更新的信号1,此时数据表不再更新,
// 在上述data_input_result_view_update函数中完成界面下方数据不在更新,便于观察
flag_system_updata = 1;
// 双击选中某条样本之后,QCheckBox为未选中状态,Update_Table_Box为QCheckBox的名字
ui->Update_Table_Box->setChecked(false);
}
// 产生是否选中QCheckBox事件,若选中则发送数据更新的信号为0,继续更新,该槽函数本身自动产生事件,不需要进行槽函数调用
void MainWindow::on_Update_Table_Box_stateChanged(int arg1)
{
bool status_check = ui->Update_Table_Box->isChecked();
if (status_check == true)
{
flag_system_updata = 0;
}
}
// 为了防止表格更新,还需要在读取数据库函数那里进行判断,这样才能保证双击之后不再更新,下方控件仅显示需要观察的数据
void MainWindow::data_input_result_view_update()
{
QSqlQuery query_prediction(db_MUI);
QDateTime finish_Qdatetime_new, finish_Qdatetime_old, current_time;
bool ok;
// 双击某条样本之后,数据表更新信号为1,此时给出条件语句,直接返回,不再读取数据表更新数据
if (flag_system_updata == 1)
{
return;
}
}
总结
首先本篇进行了系统实现双击表格某一行,表格数据不再更新,可以查看该行所有信息,选中表更新之后,数据可以继续更新的功能演示和具体代码编写,并对代码进行了详细解释。如果有问题,欢迎评论区讨论。