当前位置: 代码迷 >> 综合 >> Qt的使用记录
  详细解决方案

Qt的使用记录

热度:30   发布时间:2024-02-20 11:32:48.0

1、添加Qt程序图标

RC_ICONS=xx.ico
或者使用
setWindowIcon("xxx.icon");

2、转义字符

单引号:需要实现效果 hello 'Qt'
在程序中你需要的操作是hello \'Qt\'
但是我出现过需要为\也要添加转义符的情况,操作为:hello \\\'Qt\\\'
双引号:
需要实现效果 hello "Qt"
在程序中你需要的操作是hello \"Qt\"
但是我出现过需要为\也要添加转义符的情况,操作为:hello \\\"Qt\\\"

3、findChild函数

QLineEdit* lE=findChild<QLineEdit*>("lE_Temp"+QString::number(i));
QLineEdit* lE=findChild<QLineEdit*>();
返回对象中类型可以转换为T,并且名为name的孩子。如果不满足条件,则返回0。
默认执行递归搜索,除非指定选FindDirectChildrenOnly。
如果有一个以上的孩子匹配搜索,返回最直接的祖先。
如果有几个直系祖先,没有定义哪一个将被返回。
这种情况下,应该使用findChildren()。说简单点,就是一个找爸爸的函数

4、QSetting函数

//设置配置文件的目录和位置,如果有,则不动,没有,会自动创建
//构造函数的第一个参数是ini文件的路径,第二个参数表示针对ini文件,第三个参数可以缺省
Qsetting = new QSettings("F:/config.ini",QSettings::IniFormat);
if(setting->contains(tr("set/time%1").arg(i+1))){//将读取到的ini文件保存在QString中,先取值,然后通过toString()函数转换成QString类型qDebug() <<  setting->value(tr("set/time%1").arg(i+1)).toString();
}
else{setting->beginGroup(tr("set/")); //开始节点,向ini文件的写入内容//ini文件中写入内容,setValue函数的两个参数是键值对,time节下的第一个参数setting->setValue(tr("time%1").arg(i+1),"00:00:30");setting->endGroup(); //结束节点qDebug() <<  setting->value(tr("set/time%1").arg(i+1)).toString();
}

5、设置和取消正则表达式

QRegExp reg("^-?(\\d{0,0}\\d(\\.\\d{1,2})?)$");
设置正则表达式:ui->lineEdit->setValidator(new QRegExpValidator(reg));
取消正则表达式:ui->lineEdit->setValidator(0);

6、获取剪贴板的内容

/* 获取系统剪贴板指针 */
QClipboard *clipboard = QApplication::clipboard();   
/* 获取剪贴板上文本信息 */
QString text  = clipboard->text();            

7、mouseMoveEvent不响应

1. 如果是普通的QWidget,需要在构造函数添加如下内容:setMouseTracking(true);
2. 如果是 MainWindow ,则需要在构造函数添加如下内容:
setMouseTracking(true);
ui->centralWidget->setMouseTracking(true);

8、QByteArray转QString需要注意的一个问题 


QByteArray can be used to store both raw bytes (including '\0's) and traditional 8-bit '\0'-terminated strings.
QByteArray 是可以包含‘\0'的,比如:
QByteArray ba;
ba += '1';ba += '2';ba += '\0';ba += '3';ba += '4';
QString str(ba);
str的内容是"12",而"\034"被抛弃了

9、获取信号的发送者

 
void QCalculatorUI::slot_click1()
{QPushButton* b = (QPushButton*)sender();  // 获取到了发送该信号按钮的指针qDebug() << b->objectName();
}

10、串口接收不完全(QSerialport)

以前在自己学习Qt串口的时候,接收不完全的时候只是做了一个最粗糙的拼接,比如:<head><data><crc><tail>,数据接收不完全一般都是找不到有头没尾,所以我当时的处理是出现有头没尾的时候,我就再次读取将两组数据拼接在一起,如果还是错误的,我就直接将两组数据都丢弃了,从头来,这样会丢弃很多组数据,因为:
可能第一条<head><data> 第二条是第一条的<crc><tail>和第二条的<head> <data>,这样下去丢失数据比较严重,
所以后来在工作中,保证数据不丢失是一个重要的问题,所以我就弄成一个队列的信息,设置一个定时器,500ms读取一次串口的所有内容
myBa.append(port->readAll());
之后将这些数据开始分析
一条一条信息的来,先找第一个头、尾的位置,再确定第二个头的位置
没找到头但是有信息,报告错误,同时清空
有头无尾,则等待,调用port->readAll();重新确定位置,
有尾无头,直接去除到此尾部的信息
有两个头,中间无尾巴,去除前面一个头
然后将正确信息发送到数据处理函数里,并去除此条信息,再处理队列里的其他数据

 

  相关解决方案