学习QML还是C++?
想到什么写什么,方便记录给自己看,也分享给百度的各位猿人们。
目录
前言:
目录:
正文:
1.获取某一字符串在另一长字符串中出现次数:
2.设置exe显示图标
3.将16进制数组转换为字符串显示
4.emit槽函数简单说明使用
5.16进制数组转换为10进制整数
6.避免循环循环太快接收不到消息队列 导致界面假死现象
7.右下角显示托盘图标(缩到后台运行)
8.创建动态一维数组
9.获取发送信号端标识
10.替换多种字符串
11.connect使用Lambda 函数写法免去链接槽
12.CRC16函数
13.路径选择与指定文件选择
14.TXT的存储与读取
15.字符串拆分字节
16.将窗口放在最前面,不受任何外部界面影响,超过ApplicationModal
17.全局声明函数的最佳方式(其他类可调用使用)
18.遍历文件夹
19.定时关闭单项/双项提示框
20.数字转字符串固定长度0位补齐
21.textedit插入文本并设置插入文本不同颜色字体
22.视频播放功能(AVI)
23.tablewidget快速赋值使用(解决行高自适应)
24.QCustomplot曲线模式通用界面及函数(随用随复制粘贴)
25.QCustomplot柱状模式通用界面及函数(随用随复制粘贴)
26.实现控件的振动效果
27.十六进制转浮点型数据
28.高分辨率屏幕显示界面与ui保持一致
29.阻塞线程延时,处理完之前在延时之后
30.点击屏幕关闭窗口
31.设置窗口置顶/无边框/去掉最大化最小化按键
32.平板电脑触摸事件识别
33.代替QProcess快速打开文件函数
34.打开新ui界面,关闭时释放全部资源
35.通过控件名称快速定位到控件使用
啊哦,qt中未找到实现方式,还得自己写方式,暂时空
在pro文件添加
win32:{
RC_FILE += appico.rc
}
在文件中填上图片生成的ico 文件,不能直接改尾缀名,否则编译报错。
文件内容:IDI_ICON1 ICON DISCARDABLE "PIC/bayi.ico"
例如0x11 0x22 0xaa 0xbb,转换成字符串1122aabb
char tdate[200];
char c1,c2;
for (i = 0; i < bytelen; i++)
{
c1 = rxdata[i] & 0xFu;
c2 = (rxdata[i] >> 4) & 0xFu;
sprintf((char*)tdate + i * 2, "%x%x", c2, c1);//若转换为大写字符串,则%X
}
以上是分割开字符串的参考例程,不拆去掉判断i即可,其中i循环次数为需要数组转换字符串 的长度
方法二:
QString sall="",ssingle="";
ssingle.clear();
for(int j=0;j
方法三:
qDebug()<
假如有A类和B类,想要通过B中的某个信号触发了传递给A类处理
B.cpp
emit new_mod_end(ui->lineEdit->text());
B.h
signals:
void new_mod_end(QString);
A.cpp
//初始化或者新建B类的时候
B*kufangname= new B();
kufangname->show();
kufangname->setAttribute(Qt::WA_DeleteOnClose);//若是关闭界面,则彻底释放资源
connect(kufangname,SIGNAL(new_mod_end(QString)),this,SLOT(on_pushButton_save_clicked(QString)));
//触发时刻
void A::on_pushButton_save_clicked(QString aaa)
{
qDebug()<
A.h
private slots:
void on_pushButton_save_clicked(QString);
unsigned long long number=0;//定义一个8字节无符号型整数,想要将此整数用于存放unix时间
for(int i=0;i<8;i++){//localddno数组里是8个字节的数,将他们组合到一起
number=number<<8;
number=number|localddno[7-i];
}
//输出number用于使用
QCoreApplication::processEvents(QEventLoop::AllEvents, 10);//设置时间
QCoreApplication::processEvents();//不带时间
包含头文件QSystemTrayIcon
QSystemTrayIcon *trayIcon;
trayIcon= new QSystemTrayIcon(this);
trayIcon->setIcon(QIcon(":/PIC/Logo.ico"));
trayIcon->setToolTip(tr("WeChat:kuangboqi123\nTIM:1950361006\n工作时间:xxxh\n消息提醒:关闭(F8)")); //设置鼠标放上去显示的信息
QMenu *menu = new QMenu(this); //右键菜单
menu->addAction(ui->action_WEB); //这几个action是在设计师下添加的
menu->addAction(ui->action_QT);
menu->addAction(ui->action_man);
menu->addAction(ui->actionExit);
trayIcon->setContextMenu(menu); //设置右键菜单
connect(trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
this, SLOT(slotIconActivated(QSystemTrayIcon::ActivationReason)));
trayIcon->show();
对应的槽函数:
//将缩到后台的程序放在最顶端
void MainWindow::slotIconActivated(QSystemTrayIcon::ActivationReason reason)
{
switch(reason)
{
case QSystemTrayIcon::Trigger :
setWindowState(Qt::WindowActive);
activateWindow();
break;
default:
break;
}
}
//分配动态一维数组
int *arr=new int[n];
用完后要记得释放:
//释放arr数组
delete[] arr;
sender()返回的是QObject*类型的,可以用qobject_cast进行类型转换,比如:
void XX::on_pushButton_clicked()
{
QPushButton *button = qobject_cast(sender());
QString strButtonText = button->text();
......
}
QRegExp exp("[年月日-:-: ]");
QString dddata="2019 年-16月::: 24日::--- -- ";
QString newName =dddata.replace(exp,"");
qDebug()<
这里一定要注意在exp()中,双引号内要加[],代表 替换[]内所有字符,否则就代表替换整体exp的字符串,这个耽误了我好几分钟时间。
connect(ui->page1_repair, &QPushButton::clicked,[=](){
/* do something.. */
qDebug()<<"lambda 表达式";
});
quint16 MainWindow::crc16ForModbus(const QByteArray &data)
{
static const quint16 crc16Table[] =
{
0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,
0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,
0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40,
0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841,
0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40,
0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41,
0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641,
0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040,
0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240,
0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441,
0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41,
0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840,
0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41,
0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40,
0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640,
0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041,
0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240,
0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441,
0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41,
0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840,
0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41,
0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40,
0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640,
0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041,
0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241,
0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440,
0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40,
0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841,
0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40,
0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41,
0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641,
0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040
};
quint8 buf;
quint16 crc16 = 0xFFFF;
for ( auto i = 0; i < data.size(); ++i ){
buf = data.at( i ) ^ crc16;
crc16 >>= 8;
crc16 ^= crc16Table[ buf ];
}
return crc16;
}
使用方式:例如
QByteArray sd;
sd[0]=0xFE;
sd[1]=0x06;
sd[2]=0x00;
sd[3]=0x01;
sd[4]=0xaa;
sd[5]=0xbb;
quint16 aaa=crc16ForModbus(sd);
sd[6]=aaa;
sd[7]=aaa>>8;
socket->write(sd);
//获取路径
QString dir = QFileDialog::getExistingDirectory(this, tr("选择存储路径"),"/home",QFileDialog::ShowDirsOnly|QFileDialog::DontResolveSymlinks);
if(dir.isEmpty());
massage_dialog(1,"提示","选择路径出错!");
else{
}
//获取桌面路径
QString desktop_path = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);
QString fileName = desktop_path+"/" + timestr + ".ini";
//获取指定文件
QString fileName = QFileDialog::getOpenFileName(this,tr("选择待解密文件"),"",tr("TXT(*.txt *.ini)")); //选择路径
if (fileName.isEmpty()){ //如果未选择文件便确认,即返回
//QMessageBox::information(0,QObject::tr("Warning"),QObject::tr("文件为空!"));
}
else{}
读取:
//读取txt
QFile file(fileName);
if (file.open(QIODevice::ReadOnly | QIODevice::Text))
{
while (!file.atEnd())
{
line = file.readLine();
}
file.close();
}
判断文件夹和文件是否存在,不存在创建,最后存储:
//单写入txt
QFile file(fileName);
file.open(QIODevice::WriteOnly | QIODevice::Text );
QTextStream in(&file);
in << “数据”;
file.close();
//判断文件夹在写入
QDir *folder = new QDir;
bool exist = folder->exists(qApp->applicationDirPath()+"/history");//history文件夹是否存在
if(!exist)folder->mkdir(qApp->applicationDirPath()+"/history");//不存在创建文件夹
QFile file(qApp->applicationDirPath()+"/history/"+QDateTime::currentDateTime().toString("yyyyMMdd")+".db");
file.open(QIODevice::WriteOnly|QIODevice::Text|QIODevice::Append);
QTextStream stream(&file);
stream<
unsigned int rxdata[8];
QByteArray dataTemp="aabb112233445566";
for(int i=0;i<8;i++){//拆分字符串为字节
rxdata[i]=(unsigned char)dataTemp.mid(i*2,2).toInt(&ok,16);
//qDebug()<<"rxdata["<
MainWindow *pangfu=new MainWindow;
pangfu->setWindowFlags(pangfu->windowFlags() | Qt::WindowStaysOnTopHint);
pangfu->show();
pangfu->raise();
pangfu->setAttribute(Qt::WA_DeleteOnClose);
在h文件中
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
static QPoint move_point;
static uint chartP_count_page1;
在cpp开头
QPoint MainWindow::move_point;
uint MainWindow::chartP_count_page1;
方式一:
//只要文件,排除文件夹
QDir dir(place);
dir.setFilter(QDir::Files);//除了文件,其他的过滤掉
QFileInfoList aaa=dir.entryInfoList();
// aaa.removeFirst();//去掉文件自带的“.”
// aaa.removeFirst();//去掉文件自带的“..”
for(int i = 0; i < aaa.size(); i++)qDebug()<dateEdit_history->text().replace(exp,"");
QVector listnum;//记录不在范围的序号
for(int i = 0; i < list_history.size(); i++){//筛选时间外的数据标号
if(list_history.at(i).fileName().replace(exp,"")>sidetime)//判断时间
listnum.append(i);
}
for(int i = 0; i < listnum.size(); i++)//剔除不在时间范围的文件记录
list_history.removeLast();
//此时list_history是最终需要的
方式二:
QFileInfoList GetFileList(QString path)
{
QDir dir(path);
QFileInfoList file_list = dir.entryInfoList(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
QFileInfoList folder_list = dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot);
for(int i = 0; i != folder_list.size(); i++){
QString name = folder_list.at(i).absoluteFilePath();
QFileInfoList child_file_list = GetFileList(name);
file_list.append(child_file_list);
}
return file_list;
}
//全车型文件故障解析
void MainWindow::on_pushButton_7_clicked()
{
QString dirIN = QFileDialog::getExistingDirectory(this, tr("选择需要解析的文件路径"),"/home",QFileDialog::ShowDirsOnly|QFileDialog::DontResolveSymlinks);
if(dirIN.isEmpty());
else{
QDir *folder = new QDir;//创建文件夹
temppath.append(dirIN+QString("/Temp%1").arg(QDateTime::currentDateTime().toString("yyyyMMddhhmmss")));//创建文件夹
folder->mkdir(temppath.last());//创建文件夹
QFileInfoList file_info_list =GetFileList(dirIN);
foreach(QFileInfo fileinfo, file_info_list){
//筛选后缀名为db的文件//筛选文件名长度为8的文件//筛选文件大小不为0的文件
if(fileinfo.suffix()!="db"||fileinfo.baseName().length()!=8||fileinfo.size()==0)
continue;
QFile::copy(fileinfo.absoluteFilePath(),temppath.last()+"/"+fileinfo.baseName()+".db");
}
//.....
}
}
bool massage_dialog(int button_num,QString tile_text,QString massage_content,char ff)
{
int flag;
QMessageBox *msgBox = new QMessageBox();
QTimer::singleShot(5000,msgBox,SLOT(close())); //也可将accept改为close,定时关闭提示框,防止信号阻塞和假死
/*调整提示框样式*/
switch (button_num) {
case 1:
msgBox->addButton(QObject::tr("确定"), QMessageBox::YesRole);
break;
case 2:
msgBox->addButton(QObject::tr("确定"), QMessageBox::YesRole);
msgBox->addButton(QObject::tr("取消"), QMessageBox::NoRole);
break;
default:
break;
}
msgBox->setWindowTitle(tile_text);
msgBox->setText(massage_content);
if(ff==0)msgBox->setIcon(QMessageBox::NoIcon);
else if(ff==1)msgBox->setIcon(QMessageBox::Information);
else if(ff==2)msgBox->setIcon(QMessageBox::Warning);
else if(ff==3)msgBox->setIcon(QMessageBox::Critical);
else if(ff==4)msgBox->setIcon(QMessageBox::Question);
//msgBox->setStyleSheet("background-color:white");
/*显示提示框*/
QFont font;
font.setPixelSize(25);
msgBox->setFont(font);
msgBox->setFixedSize(400, 400);
flag = msgBox->exec();
return flag;
}
参数1是选择单项还是双向1~2
参数2是提示框的标题any
参数3是提示框的文本any
参数4是提示框的图标类型0~4
目前设置是显示提示框之后无操作5秒自动关闭提示框,双向按键默认是取消按键,取消按键返回true,只有确认按键 才返回false,所以一般我们用双项提示框做是否判断处理时,语句如下
if(!massage_dialog(2,"标题","内容嘻嘻嘻?",4)){
//点击了确认,处理数据
}
else{
//取消了提示框,否定了提示框选择
}
比如1,我想转成 "001"
有两种方法:
方法一:
int i=1;
QString b=QString("%1").arg(i, 3, 10, QChar('0'));
其中3表示需要保留3位数字,10是10进制,后面是以0补齐的意思。
方法二:
int cmd=1;
QString str=QString::number(cmd).sprintf("%03d",cmd);
//处理接收信号
void NetTest::comBatAnalyze(QByteArray &allData)
{
QByteArray dataTemp;
dataTemp=allData.toUpper();//大写转换
QTextCharFormat fmt;
fmt.setForeground(Qt::blue);//设置字体颜色
QFont font("黑体",12,QFont::Bold,false);//设置字体,字号,粗体,斜体
fmt.setFont(font);
ui->textEdit->setCurrentCharFormat(fmt);
ui->textEdit->append(QDateTime::currentDateTime().toString("[yyyy-MM-dd hh:mm:ss.zzz]"));
dataTemp.clear();
allData=dataTemp;
}
pro文件加上QT+=multimedia multimediawidgets
ui文件创建widget,button,slider
h文件
#include
#include
QMediaPlayer *mediaplayer;//ui提升为QvideoWidget
cpp文件
初始化
mediaplayer=new QMediaPlayer(this);//创建mediaplayer
//设置播放属性
//监听信号变化函数
connect(mediaplayer,&QMediaPlayer::stateChanged,[=](QMediaPlayer::State state){
switch (state) {
case QMediaPlayer::PlayingState:
break;
default:
break;
}
});
//播放进度信号变化函数
connect(mediaplayer,&QMediaPlayer::positionChanged,[=](qint64 position){
ui->horizontalSlider->setValue(position);//改变播放位置
});
//播放长度信号变化
connect(mediaplayer,&QMediaPlayer::durationChanged,[=](qint64 duration){
ui->horizontalSlider->setRange(0,duration);
});
//获取进度条的位置
connect(ui->horizontalSlider,&QSlider::sliderMoved,[=](qint64 position){
mediaplayer->setPosition(position);
});
//设置播放内容
mediaplayer->setMedia(QUrl::fromLocalFile(qApp->applicationDirPath()+"/video/help.avi"));
mediaplayer->setVideoOutput(ui->widget_2);//设置QVideoWidget
函数部分
//返回维修建议界面
void repairsuggest::on_pushButton_8_clicked()
{
mediaplayer->stop();
ui->pushButton_9->setChecked(false);
ui->stackedWidget->setCurrentIndex(0);
}
//播放开始/暂停
void repairsuggest::on_pushButton_9_clicked()
{
switch (mediaplayer->state()) {
case QMediaPlayer::PlayingState:
mediaplayer->pause();
break;
default:
mediaplayer->play();
break;
}
}
ui->tableWidget_gzk->clearContents();//清空内容
ui->tableWidget_gzk->verticalHeader()->setVisible(false);//去掉行序号
ui->tableWidget_gzk->horizontalHeader()->setFixedHeight(40); //设置表头的高度
ui->tableWidget_gzk->horizontalHeader()->setStretchLastSection(true);//设置表格是否充满,即行末不留空
//ui->tableWidget_gzk->horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed); //禁止鼠标拖放列宽度
ui->tableWidget_gzk->horizontalHeader()->setFocusPolicy(Qt::NoFocus); //设置表头不可选
ui->tableWidget_gzk->horizontalHeader()->setHighlightSections(false); //设置表头不可选//QTableWidget表头塌陷问题解决
ui->tableWidget_gzk->setEditTriggers(QAbstractItemView::NoEditTriggers);//设置表格内容不可修改
ui->tableWidget_gzk->setSelectionBehavior(QAbstractItemView::SelectRows);//设置选中就是一行选中
ui->tableWidget_gzk->setSelectionMode(QAbstractItemView::SingleSelection);//设置只能选中一行
ui->tableWidget_gzk->setFocusPolicy(Qt::NoFocus);//设置去掉选中虚线框
ui->tableWidget_gzk->setAlternatingRowColors(true);//设置表格颜色交替
//表格滚动部分实现函数:初始化函数+以下俩函数+eventFilter(QObject *obj, QEvent *event)
ui->tableWidget_gzk->viewport()->installEventFilter(this);//对此对象安装事件过滤器
ui->tableWidget_gzk->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);//设置滚动模式按照像素滑动,做表格滑动时使用
ui->tableWidget_gzk->setColumnCount(9);//设置列数量
//for(int j=1;j<11;j++)
// ui->tableWidget_2->horizontalHeader()->setSectionResizeMode(j, QHeaderView::Stretch);//设置某列平均填满屏幕宽度
ui->tableWidget_gzk->setColumnWidth(0,50);
ui->tableWidget_gzk->setColumnWidth(1,100);
ui->tableWidget_gzk->setColumnWidth(2,100);
ui->tableWidget_gzk->setColumnWidth(3,100);
ui->tableWidget_gzk->setColumnWidth(4,100);
ui->tableWidget_gzk->setColumnWidth(5,200);
ui->tableWidget_gzk->setColumnWidth(6,500);
ui->tableWidget_gzk->setColumnWidth(7,100);
ui->tableWidget_gzk->setColumnWidth(8,500);
ui->tableWidget_gzk->setHorizontalHeaderLabels(QStringList{"序号","故障代码","故障原因","维修代码","故障诊断","故障现象/结论","维修指导","维修工具","维修说明"});//设置table列表各项标题
ui->tableWidget_gzk->horizontalHeader()->setFont(QFont("SimHei", 13));
xxxx刷新表格,之后再执行下面的函数才有效
ui->tableWidget_gzk->resizeRowsToContents();//自适应行高
//for(int a=0;a<11;a++)
// ui->tableWidget_2->resizeColumnToContents(a);//重新设置每列宽度,最长自适应
qss
QTableView{
alternate-background-color:rgb(255,255,255,20);
background:rgb(255,255,255,40);
color:white;
}
QHeaderView::section{
background-color:rgb(40,143,218);
font:13pt '宋体';
color: white;
background-color: rgb(35, 43, 193);
}
QTableView::Item:Selected{
alternate-background-color:rgb(255,255,255,20);
background:rgb(255,255,255,40);
color: rgb(0, 0, 255);
}
QScrollBar:vertical {
border: none;
background-color: rgba(255, 255, 255);
width: 5px;
margin: 0px 0 0px 0;
}
QScrollBar::handle:vertical {
border: none;
border-radius:2px;
background: rgba(154, 154, 154, 150);
min-height: 15px;
}
QScrollBar::sub-line:vertical {
border: none;
height: 0px;
subcontrol-position: top;
subcontrol-origin: margin;
}
QScrollBar::add-line:vertical {
border: none;
height: 0px;
subcontrol-position: bottom;
subcontrol-origin: margin;
}
QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical {
border:none;
width: 0px;
height: 0px;
}
QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical {
background: none;
}
执行效果如下,实现方式看此贴
执行效果如下,实现方式看此贴
void widgetShake(QWidget *pWidget, int nRange)
{
int nX = pWidget->x();
int nY = pWidget->y();
QPropertyAnimation *pAnimation = new QPropertyAnimation(pWidget,"geometry");
pAnimation->setEasingCurve(QEasingCurve::InOutSine);
pAnimation->setDuration(300);
pAnimation->setStartValue(QRect(QPoint(nX,nY),pWidget->size()));
int nShakeCount = 20; //抖动次数
double nStep = 1.0/nShakeCount;
for(int i = 1; i < nShakeCount; i++){
nRange = i&1 ? -nRange : nRange;
pAnimation->setKeyValueAt(nStep*i,QRect(QPoint(nX + nRange,nY),pWidget->size()));
}
pAnimation->setEndValue(QRect(QPoint(nX,nY),pWidget->size()));
pAnimation->start(QAbstractAnimation::DeleteWhenStopped);
}
方法1:利用union巧妙转换,创建结构体
union packet
{
float f;
quint8 buf[4];
};
函数调用
union packet data1;
for(int a=0;a<4;a++)data1.buf[a]=rxdata[13+a];
float have=data1.f;
ui->label2->setText(QString("总容量%1M\r\n剩余容量%2M").arg(all).arg(have));
方法2:
unsigned char s[4];
//32位
s[0]=0x4E;
s[1]=0x62;
s[2]=0x50;
s[3]=0x40;
float f2;
memcpy_s(&f2 , sizeof(float) , s , 4);
qt creator的ui界面普通解决办法:
int main(int argc, char *argv[])
{
qputenv("QT_AUTO_SCREEN_SCALE_FACTOR", "1");//设置界面跟随UI中设计的一样,取物理尺寸,不取分辨率尺寸显示
QApplication a(argc, argv);
Sysin w;
w.show();
return a.exec();
}
qt+gtk+ui界面常规方法解决不了的办法
见帖子
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);//给100ms处理时间,处理完立马退出,未处理完超过100ms也退出
QThread::msleep(200);//阻塞延时200ms
this->setWindowFlags(Qt::FramelessWindowHint| Qt::Popup);//设置窗体无边框,Qt::Popup表明此窗口为最上层模态窗口,点击子窗口之外的位置都会自动隐藏,类似于菜单的效果。
//实现点击屏幕即关闭界面
//重写事件,捕获窗口失去焦点关闭界面
bool MessageBox5_3::event(QEvent *event)
{
if (event->type() == QEvent::ActivationChange){
if(QApplication::activeWindow() != this)//窗口失去焦点,关闭界面,Qt::Popup必须有
this->close();
}
return QWidget::event(event);
}
//点击
void MessageBox5_3::mousePressEvent(QMouseEvent *event)
{
this->close();
}
//this->setWindowFlags(Qt::FramelessWindowHint);//窗口无边框
this->setWindowModality(Qt::ApplicationModal);//设置一直保持在顶端,不可切换其他界面,除非被新界面带此属性覆盖
this->setWindowFlags(Qt::Dialog);//取消窗口最大化最小化按钮
当使用setWindowFlags时,属性要并列放在函数入口里才能同事生效,否则只有最后一个属性生效,如上面的如果把第一行打开,那么还是有边框的,因为属性被第三行替换,如果把第三行和第一行换顺序,那么只有无边框生效,虽然最大最小被隐藏了无所谓,但是其他属性时会失效,所以要并列设置,如下所示
this->setWindowFlags(Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint);//设置窗口无边框,设置窗口置顶,同时设置才能全部生效
this->setAttribute(Qt::WA_AcceptTouchEvents);
增加此句话,在平板电脑就可以接收触摸事件信号,window平板点击输入框可自动弹出键盘(待测试,猜测)参照链接
QDesktopServices::openUrl(QUrl::fromLocalFile(path));
使用ui多级时,有时会往复打开关闭某一个界面,这时候如果界面资源未被全部释放完毕,再次打开此界面会出现意想不到的问题导致界面崩溃、界面通讯失灵、界面操作无效等等,这是就要注意一些编程方式,从写程序上避免问题发生。
注意点1:新建ui时加入关闭界面释放资源函数
System_check *check = new System_check();
check->show();
check->setAttribute(Qt::WA_DeleteOnClose);//若是关闭界面,则彻底释放资源
注意点2:在界面打开新的控件或通讯类时,在new时要指定控件归属
m_dapro = new Dataprocess(this);
Dataprocess为底层数据处理函数,无ui界面,调用此类就要指定属于this的子类,当this被关闭后,会自动释放Dataprocess占用的资源
serial = new QSerialPort(“COM1”,this);
通讯类函数同样,不指定归属,在界面关闭在进入后就会导致串口通讯失灵,要么就是数据会多次接收或发送。
this->findChild("label_pic_"+QString::number(id))->setPixmap(QPixmap::fromImage(*img_tmp[id-1]));
this->findChild("btn_picmax_"+QString::number(id))->setVisible(false);