【医疗仪器工业仪器上位机】【图文】QT5+mysql数据库+widget显示

用qt5写的,可进行自定义操作步骤,也可以拿预设的来进行操作。所有操作的数据保存在数据库中,防止自己操作的编辑步骤丢失。根据实际步骤需要,操作人员根据现有条件,标准方法,每操作一步,进行打钩和下一项,这样可以标准化流程,规范流程。能记录当前操作保存的记录步骤,断电、误操作都能恢复之前的步骤数据。

先看功能预览视频,由于数据库还没完善,所以先随便读几个,整个步骤框架和功能在视频中都能体现。

医学图像检测仪功能

 

2022.4.22

首先吐槽一波,没天理啊,某研二的学长花了2个月画了个界面的头,导师气死了,项目要黄了,着急的立马来找我,我本着划水的态度,先复习会教资。这个功能也不难啊!!!花了一晚上肝了出来了一个demo

【医疗仪器工业仪器上位机】【图文】QT5+mysql数据库+widget显示_第1张图片【医疗仪器工业仪器上位机】【图文】QT5+mysql数据库+widget显示_第2张图片

界面功能说明:

按下复选框,右边的text文本跟着复选框的动,左边列表高亮某行,下方表格添加一行新的。

按下右上方按钮,把多页stackwidget隐藏,按下其余的2个按钮分别是多页取上一页/下一页(如果没有,那么就创建新的)。

这个demo就是这样,符合此项目的需求。

此项目为医疗项目,上方显示LOGO,之后可以进行操作,以一条操作为例:从数据库中读取医疗操作步骤,显示在左边列表中,完成第N步骤后点击下一页,则下一步高亮显示,同时页面显示出第N+1步骤的界面,表格是根据医护人员点击操作按钮进行选择是否操作勾选,有自定义选项。

待更新中。。。

#include "widget.h"
#include "ui_widget.h"
#include 
#include 
#include 
#include 

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}


void Widget::on_box3_currentTextChanged(const QString &arg1)
{

    //添加列表
    QStringList strList;
    strList<<"高三(1)班"<<"高三(2)班"<<"高三(3)班";
    QStringListModel *stringListModel = new QStringListModel(strList);
    ui->buzhou_view->setModel(stringListModel);
    ui->buzhou_view->setCurrentIndex(stringListModel->index(2));//高亮   string list中的2(0,1,2)

    ui->text->setText(arg1);//text框内容跟着box3的选择内容变


    //添加表格
    int row = ui->renwubiao->rowCount();//动态添加行
    ui->renwubiao->insertRow(row);
    ui->renwubiao->setColumnCount(9);
    ui->renwubiao->resizeColumnsToContents();//自动调整所有列的宽度,以适应其内容。
    QStringList strList2;
    strList2 <renwubiao->setHorizontalHeaderLabels(strList2);

    //设置表格首列为 CheckBox 控件
    //for(int i=0;irenwubiao->rowCount();i++)    {
        QTableWidgetItem* p_check = new QTableWidgetItem();
        p_check->setCheckState(Qt::Unchecked);        //设置首列为 CheckBox 控件,没有选中的状态
        ui->renwubiao->setItem(row,0,p_check);
    // }

        qDebug()<<"change";

}


void Widget::on_renwubiao_currentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn)
{


}


void Widget::on_renwubiao_itemClicked(QTableWidgetItem *item)
{
    qDebug()<row()+1;//复选框点击后,出现当前行
}

static int current_page=0;
void Widget::on_last_button_clicked()
{
    //如果超出了最大页,则新建一页wid
    my_widget = new QWidget(this);//this是在主的stack wid中加入wid
    my_botton = new QPushButton(my_widget);//在新建的widget中,放入btn

    current_page++;
    ui->multipleWidget->setCurrentIndex(current_page);//设置复选框当前显示的页码

    my_botton->setText("text");
    ui->multipleWidget->addWidget(my_widget);
}


void Widget::on_next_button_clicked()
{
    current_page--;
    ui->multipleWidget->setCurrentIndex(current_page);
}


void Widget::on_exit_button_clicked()
{
    //隐藏多页的wid
    static int i=0;
    if(i==0){ui->multipleWidget->hide();i=1;}
    else {ui->multipleWidget->show();i=0;}

}

2022年5月4日11:53:29

【医疗仪器工业仪器上位机】【图文】QT5+mysql数据库+widget显示_第3张图片

 没什么好说的,具体的技术就是上述的工程demo做的。

遇到一个bug,就是显示中文的时候会闪退,找了很久,以为是野指针/不允许使用中文,各种找,结果发现是字库的问题,“设备”的备这个字,我在搞单片机的时候也是没法使用,要装一个插件,这个bug找了好久。

2022年5月5日19:05:14

加入了数据库功能,加入了创建和编辑任务功能

【医疗仪器工业仪器上位机】【图文】QT5+mysql数据库+widget显示_第4张图片

【医疗仪器工业仪器上位机】【图文】QT5+mysql数据库+widget显示_第5张图片 【医疗仪器工业仪器上位机】【图文】QT5+mysql数据库+widget显示_第6张图片

双击表格中任意一行任意位置,跳出对应的步骤功能,在步骤中,左边显示步骤总数,高亮显示当前步数,可以点击任意一行进行跳转,上方按钮(偷懒没改位置),可进行单步操作,同时红色区域会显示当前步骤的说明。

其中的技术点,直接看代码段的注释

QMessageBox::information(this, QString("提示"),QString("已经完成所有操作"));//弹出消息框

 my_Label[i] -> setText("第"+QString("%1").arg(i+1)+"步");//当前步骤数 int变量转字符串qstring


void Widget::on_buzhou_view_clicked(const QModelIndex &index)//点击步骤表里的list
{
    current_page = index.row();
    ui->multipleWidget->setCurrentIndex(current_page);//设置复选框当前显示的页码
}

ui->renwubiao->resizeColumnsToContents();//自动调整所有列的宽度,以适应其内容。


//双击了某个任务后,一步步进行操作
void Widget::on_renwubiao_itemDoubleClicked(QTableWidgetItem *item)

 muliple_page_number = tmp.size();//获得长度大小

my_Label[i]->adjustSize();//label自适应text大小

ui->buzhou_view->setCurrentIndex(stringListModel->index(current_page));//高亮

 int number=TMP_Vector.count();
    while(number--)TMP_Vector.removeFirst();//清空缓存的列表元素

        int rowNum=  ui->gongnengbiao->rowCount();
        for(int i = 0 ; i < rowNum ; i++)//清空列表
        {
            ui->gongnengbiao->removeRow(0);
        }


ZHENGJI_STEP.append(ui->textEdit->toPlainText());//获取文本写入标题




//点击了表格里的勾勾
void ChuangJianZhengJiJianCe::on_gongnengbiao_itemClicked(QTableWidgetItem *item)
{
    QString tmpName;
    tmpName = ui->gongnengbiao->item(item->row(),1)->text();
    qDebug()<row();

    if(item->checkState()==Qt::Unchecked){
        if(TMP_Vector.contains(tmpName)){//已经有了就删除
            TMP_Vector.removeOne(tmpName);
        }
        else{
        }
    }
    else {//如果勾勾上了
        qDebug()<

2022年5月7日19:34:11

数据库操作。插入一行数据,获取一个字段(一列所有数据),创建表,删除表,改变数据库的.db表。直接上代码。其中解决了,Qstring的中文乱码,数据库获取数据到Qstring中会有乱码,网上说的GBK还有UTF8这个问题,在我这里起不了作用,直接用string过渡一下


void mysql::mysql_init_zhengji(){
    sqlDatabase = QSqlDatabase::addDatabase("QSQLITE");
    sqlDatabase.setDatabaseName("alarm.db");
    /* 以 open 的方式打开 alarm.db 数据库,则会创建一个 alarm.db */
    if (!sqlDatabase.open())
    qDebug()<<"连接数据库错误"< mysql::mysql_get(QString table,QString field){
    //发送发到数据库
    QVector  mylist;
    QSqlQuery query;
    QString selectStr;
    int i=0;
    selectStr = "select "+ field + " from " + table;
    qDebug()<<"send_sql:"<

2022年5月20日14:40:31

qt做成网页一样的下拉菜单,其实就是按钮中添加menu功能

/*创建下拉菜单*/
    QMenu *setUpMenu = new QMenu();
        QAction *networkAction = new QAction(setUpMenu);
        QAction *changePwAction = new QAction(setUpMenu);
        QAction *aboutAction = new QAction(setUpMenu);
        networkAction->setText(tr("零件检测"));
        changePwAction->setText(tr("创建"));
        aboutAction->setText(tr("修改"));

        setUpMenu->addAction(networkAction);
        setUpMenu->addAction(changePwAction);
        setUpMenu->addAction(aboutAction);

        setUpMenu->setWindowFlags(setUpMenu->windowFlags() | Qt::FramelessWindowHint);
        setUpMenu->setAttribute(Qt::WA_TranslucentBackground);
        ui->pushButton_2->setMenu(setUpMenu);

2022年5月22日

这段时间,大改功能,变成了主Widget中嵌套嵌入式小widget,不同文件访问一个ui,这就实现了各部分功能脱离开,只要写一个管理ui的函数即可

 //创建单个任务
               instrumentDemo *instrumentDemo_UI = new instrumentDemo;
               ui->button_layout->addWidget(instrumentDemo_UI);

同时可以发送信号,因为是qt的机制信号与槽,使用emit就可以发送了,在.h文件加入信号即可


    //此发送
    connect(this,&Widget::sent_message,buzhou_muce_UI,&buzhou_muce::receive_message);
    emit sent_message(name);
signals:
    void sent_refresh_message();//发送信号的
    void sent_refresh_message2();//发送信号的
    void sent_message(QString name);
class buzhou_muce : public QWidget
{
    Q_OBJECT

public:
    explicit buzhou_muce(QWidget *parent = nullptr);
    ~buzhou_muce();
    void receive_message(QString name);//接受槽

接受的槽函数只要按照正常的函数定义和使用即可

二级下拉菜单,就是软件中点开新建这样的

/*创建下拉菜单*/
    /*---------------------------一级菜单----------------------------*/
        QMenu *setUpMenu2 = new QMenu();
        QAction *networkAction2 = new QAction(setUpMenu2);
        QAction *changePwAction2 = new QAction(setUpMenu2);
        QAction *aboutAction2 = new QAction(setUpMenu2);

        networkAction2->setText(tr("整机检测"));
        changePwAction2->setText(tr("创建"));
        aboutAction2->setText(tr("修改"));

        setUpMenu2->addAction(networkAction2);
        setUpMenu2->addAction(changePwAction2);
        setUpMenu2->addAction(aboutAction2);


    /*--------------------------二级菜单-----------------------------*/

        QMenu *son_menu2 = new QMenu(setUpMenu2);
        son_menu2 = setUpMenu2->addMenu("模板");

        QAction *son_menu2_list1 = new QAction(son_menu2);
        son_menu2_list1->setText(tr("nmd"));
        son_menu2->addAction(son_menu2_list1);


        //相关槽函数实现
        connect(networkAction2,&QAction::triggered, this,&Widget::ZhengJiJianCe_slot);
        connect(changePwAction2,&QAction::triggered, this,&Widget::ZhengJiChuangJian_slot);
        connect(aboutAction2,&QAction::triggered, this,&Widget::ZhengJiXiuGai_slot);

如果要动态销毁或者动态删除或者动态获取获得嵌入的子页面widget,直接复制代码


    //删除控件
    int num = ui->button_layout->count();//获得总数
    if(!num)return;
    QWidget *p=ui->button_layout->itemAt(num-1)->widget();//获取最后一个插入的组件
    ui->button_layout->removeWidget(p);//移除0.5
    delete p;//移除1

2022年5月25日19:23:21

动态创建按钮(根据数据库来的),实时刷新,要想要在其槽函数中知道这个动态创建的的名字,就用一下这段程序获取

 QAction *btn = qobject_cast(sender());
     //获取对象显示文本
     QString text = btn->text();
     qDebug()<

2022年5月28日19:50:47

看到抬头那个图片没有,改成了frame自适应,发现不行,以下程序就是没法适应,所以不要用这样的程序改

    myframe->setGeometry(0,0,this->width(),80);
    myframe->setStyleSheet(
                "background-image: url(:/picture/banner.jpg)"
                );

还是老老实实地用布局

为什么要这样,因为窗体拉伸后看到下面的welcome了吧,欢迎界面可以乱但标题不能乱。

这里说个策略

Fixed:控件不能放大或者缩小,控件的大小就是它的sizeHint。

Minimum:控件的sizeHint为控件的最小尺寸。控件不能小于这个sizeHint,但是可以放大。

Maximum:控件的sizeHint为控件的最大尺寸,控件不能放大,但是可以缩小到它的最小的允许尺寸。

Preferred:控件的sizeHint是它的sizeHint,但是可以放大或者缩小

Expandint:控件可以自行增大或者缩小

所以标题使用Maximum,其他控件随意

2022年5月31日12:53:22

今天要讲打包好的程序编译成动态库dll文件,方便网页web调用。qt打包dll过程

【医疗仪器工业仪器上位机】【图文】QT5+mysql数据库+widget显示_第7张图片

,如图新建一个c++library。在.h的class中写函数,写完后编译一下。

【医疗仪器工业仪器上位机】【图文】QT5+mysql数据库+widget显示_第8张图片

 在debug中找到对应的dll文件,将这个dll和.h拷贝出来

在需要调用项目的地方 加入,并且在pro中加入

LIBS += mydll.dll
DEFINES += DLL_CREATETEST_LIBRARY

之后就和正常一样调用即可

增加了一个新功能,就是筛选时间,把一个日期加入到数据库,时间戳转换和做差程序如下

//QString转QDateTime
QString strTestTime = "2021-12-30 9:46:30";
QDateTime testTime=QDateTime::fromString(strTestTime, "yyyy-MM-dd hh:mm:ss");

//QDateTime转QString
 QDateTime curDateTime = QDateTime::currentDateTime();
 QString strCurrentDateTime = curDateTime.toString("yyyy-MM-dd hh:mm:ss");


    int days=now_time.daysTo(last_time);//求天数的差值

    QDateTime now_time = QDateTime::currentDateTime();//获取当前时间
    QDateTime dateTime2=now_time.addDays(-1);

如果用直接做差,用addDays,你没看错是加,其实看原函数发现是int类型,所以填负数即可

2022年6月1日20:32:57

因为要给工人使用,工人一天要重复检测100次,所以tab聚焦焦点功能减少点击鼠标,如图设置,焦点策略

1、Qt::TabFocus:通过按下Tab键获取焦点(这时候鼠标点击获取不到焦点的)。

2、Qt::ClickFocus:鼠标点击获取焦点。

3、Qt::StrongFocus:通过Tab键和鼠标点击获取焦点。

4、Qt::WheelFocus:通过Tab键、鼠标点击、鼠标滚轮按下获取焦点。

5、Qt::NoFocus:不接受焦点。

【医疗仪器工业仪器上位机】【图文】QT5+mysql数据库+widget显示_第9张图片

你可能感兴趣的:(qt5,qt,ui,c++,健康医疗)