用qt5写的,可进行自定义操作步骤,也可以拿预设的来进行操作。所有操作的数据保存在数据库中,防止自己操作的编辑步骤丢失。根据实际步骤需要,操作人员根据现有条件,标准方法,每操作一步,进行打钩和下一项,这样可以标准化流程,规范流程。能记录当前操作保存的记录步骤,断电、误操作都能恢复之前的步骤数据。
先看功能预览视频,由于数据库还没完善,所以先随便读几个,整个步骤框架和功能在视频中都能体现。
医学图像检测仪功能
2022.4.22
首先吐槽一波,没天理啊,某研二的学长花了2个月画了个界面的头,导师气死了,项目要黄了,着急的立马来找我,我本着划水的态度,先复习会教资。这个功能也不难啊!!!花了一晚上肝了出来了一个demo
界面功能说明:
按下复选框,右边的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
没什么好说的,具体的技术就是上述的工程demo做的。
遇到一个bug,就是显示中文的时候会闪退,找了很久,以为是野指针/不允许使用中文,各种找,结果发现是字库的问题,“设备”的备这个字,我在搞单片机的时候也是没法使用,要装一个插件,这个bug找了好久。
2022年5月5日19:05:14
加入了数据库功能,加入了创建和编辑任务功能
双击表格中任意一行任意位置,跳出对应的步骤功能,在步骤中,左边显示步骤总数,高亮显示当前步数,可以点击任意一行进行跳转,上方按钮(偷懒没改位置),可进行单步操作,同时红色区域会显示当前步骤的说明。
其中的技术点,直接看代码段的注释
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过程
,如图新建一个c++library。在.h的class中写函数,写完后编译一下。
在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,qt,ui,c++,健康医疗)