Qt的使用记录

目录

1、添加Qt程序图标

2、转义字符

3、findChild函数

4、QSetting函数

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

6、获取剪贴板的内容

7、mouseMoveEvent不响应

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

9、获取信号的发送者

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

11、QTableWidget

12、background-image和border-image的区别

13、new之后需不需要delete

14、使用ISP升级单片机注意点

15、QTabWidget

16、QToolButton

17、修改UI文件无效

18、QString去除空格

19、setstylesheet子控件被父窗体的样式影响

20、调用自定义键盘的方法

21、QSS添加自定义属性

22、设置背景图片的三种办法

23、Qt::WindowFlags枚举类型

24、保存图片

25、QDialog的exec弹框消失后,程序一闪而过之前的信息

26、运行tslib下的bin文件出现selected device is not a touchscreen I understand

27、使用指定字体

28、QTableWidget的item使用QRegExp正则表达式

29、QTreeWidget

30、压缩和解压缩(qCompress)

31、设置应用程序开机自启动与删除

32、应用程序重启

33、导出文件编码格式(UTF8和GBK的区别,.cvs和.txt文件乱码)

34、提示xxx.exc 已停止工作

35、数据库常用操作

36、窗口标题栏的操作

37、语言家换行

38、目录下的文件排序

39、QMessageBox 不阻塞

40、Qt运行程序自己显示不完全

41、QObject::killTimer: timers cannot be stopped from another thread

42、Qt的针对Button的文本显示不完全则换行或者省略

43、installEventFilter使用后控件显示异常


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();重新确定位置,
有尾无头,直接去除到此尾部的信息
有两个头,中间无尾巴,去除前面一个头
然后将正确信息发送到数据处理函数里,并去除此条信息,再处理队列里的其他数据

11、QTableWidget

1、设置Qtablewidget第一列不可编辑方法:

1.1、QTableWidgetItem 的 setFlags() 和 flags()

1.2、QTableWidget 不能 设置 setEditTriggers() 为 QAbstractItemView::NoEditTriggers,否则1中的设置会失效
2、设置行列个数
ui->tableWidget->setColumnCount(5);
ui->tableWidget->setRowCount(5);
3、设置标题
ui->tableWidget->setHorizontalHeaderLabels(QStringList() << "one" << "two");
4、控制水平标题头隐藏
ui->tableWidget->verticalHeader()->setVisible(false);
5、只允许单个选中
ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectItems);
6、编辑点击触发,与关联的信号对应最佳
ui->tableWidget->setEditTriggers(QAbstractItemView::DoubleClicked);

12、background-image和border-image的区别

QLabel *mylabel = new QLabel;
//不会自动适应图片,background-image像电脑桌面的平铺,图片尺寸不变
mylabel->setStyleSheet(QString("background-image:url(:/image/test.jpg)"));
//自动适应图片,border-image像桌面的拉伸效果,常用
mylabel->setStyleSheet(QString("border-image:url(:/image/test.jpg);"));

13、new之后需不需要delete

QObjects在一个对象树中组织他们自己。当创建一个QObject时,如果使用了其他对象作为其父对象,那么,它就会被添加到父对象的children()列表中。这样一来,当父对象被销毁时,这个QObject也会被销毁。事实表明,这个机制非常适合于管理GUI对象。例如:一个QShortcut(键盘快捷键)对象是相关窗口的一个子对象,所以,当用户关闭了这个窗口时,快捷键也会被销毁。

QT的父子对象机制是在 QWidget和QOject中实现的。当我们使用父对象来创建一个对象的时候 ,父对象会把这个对象添加到自己的子对象列表中。当这个父对象被删除的时候,它会遍历它的子对象类表并且删除每一个子对象,然后子对象们自己再删除它们自己的子对象,这样递归调用直到所有对象都被删除。 
这种父子对象机制会在很大程度上简化我们的内存管理工作,减少内存泄露的风险。我们需要显试删除(就是用DELETE删除)的对象是那些使用NEW创建的并且没有父对象的对象(切记是new的才要delete,通过成员函数获得的对象,没有特殊说明的,千万不要随便delete.)。如果我们在删除一个对象的父对象之前删除它,QT会自动地从它的父对象的子对象列表中移除它的
具体例子如下:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    QLabel *label =new QLabel("hello",&w);
    //这里使用new之后不需要执行delete,因为label的父类是w,而w是在栈中创建,在程序关闭的时候会自动释放,所以作为w的子类内存也被释放。
 
    QLabel *label1 =new QLabel("world");
    //这个是需要执行delete label1,否则会造成内存泄漏,因为label没有父类,所以不会为label释放内存
    w.show();
    a.exec();
    delete label1;
    label1=NULL;
    return 0;
}

14、使用ISP升级单片机注意点

环境LPC2468
Qt程序步骤是

(元素之间要有一个空格,"OK"、"0"成功,其他失败)

1. 发送"?",会回复"Synchronized",注意大小写

2. 发送"Synchronized",会回复"OK",(自动波特率配置完成)

3. 发送系统时钟频率,会回复"OK"

4. 发送“U 23130”,会回复"0",解锁Flash写/擦除&运行命令

5. 发送“P 起始扇区号 结束扇区号”,会回复“0”;(准备操作扇区)

6. 发送“E 起始扇区号 结束扇区号”,会回复“0”。(擦除成功)

7. 发送"W 1073742336 4"向地址,0x4000 0200写入4个字节数据,如果你的字节够大剩下的就是循环烧入了

以上顺序固定不可打乱,以及在qt程序发送时,每个命令后面一定要加上\r\n的十六进制,\r 0x0D ,\n 0x0A,因为在人模拟的时候,每输入一个命令是通过回车键来发送的,命令自带\r\n

这其实只是连接命令,后面升级还要不要的发P,W,C命令,但是我就不写了,都是千篇一律的东西

注:开机后不要发送命令,如果芯片回复错误后,你就需要重启

Qt读取文件大小的时候打开的方式选择只读就可以,不要以文本形式打开,因为你的升级文件是bin文件,以文本打开的话,内容大小都会改变

15、QTabWidget

1、ui->tabWidget->setTabsClosable(true); // 生成关闭按钮
2、QString("QTabBar::tab{width: %1px;height:46px;font:20px;color:black}").arg(w);//显示设置宽度和高度,和字体大小,字体颜色
3、QString("QTabWidget::pane{border-width: 0px;border-color:white;border-style:outset;background-color: rgb(132, 171, 208);border-radius: 3px;}")//设置整体组件,pane 指整个tab组件 ,border-width 组件的外框宽度, border-color 外框颜色, border-style外框风格,比如outset就是凸出立体感,border-radius  外框的圆角像素。而本示例是无外框,无背景图的。
4、QString("QTabWidget::tab-bar{left:20px;}");//标题栏左右移动 
5、QString("QTabBar::tab:selected{margin-left: 1;margin-right: 0;color: black;background-color:rbg(100,200,255);} ");//点击tab此时的状态,margin-left距离左边的tab边缘的距离,margin-right距离右边的tab边缘的距离,color是字体颜色,background-color背景色
6、QString("QTabBar::tab:!selected{margin-left: 1;margin-right: 0;color: white;background-color:rbg(50,100,255);} ");//当有点击的时候,还要改变未点击的按钮效果
7、QString("QTabBar::tab:hover:!selected{color: white;margin-left: 1;margin-right: 0;background-color:rbg(100,200,100);} ");//突出移动到tab时候的效果
8、QString("QTabBar::tab:!selected{margin-top: 10px;margin-bottom: -10px;} ");//在将突出显示点击按钮的大小

16、QToolButton

1、QString("QToolButton{font-size:15px;max-width:180px;max-heiget:180px;min-width:180px;min-heiget:180px;background:#4c7e97;}");//设置固定大小、字体大小和背景色
2、QString("QToolButton{border-image:url(:/qt.png)}");//设置背景图
3、QString
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值