1、在复制其他Ui控件的时候,复制撤回多次后,控件的命名会出现数字叠加,并且无法删除后面叠加数字的情况,(例如: 原控件名称:pushbutton,复制撤回多次后,会变成 pushbutton_4,哪怕页面上就这一个控件,也不能把它修改为pushbuton)
解决方式:关闭文件重新打开即可修改
2、QLabel的自动换行实现方式:
①、使用函数: ui->label->setWordWrap(true);
②、在设计界面上,勾选WordWrap选项;
3、避免QWidget 控件设置parent 时背景widget会透明化的情况,可以重写该QWidget控件类的paintEvent(QPaintEvent* event)函数,如下:
void ParameterUi::paintEvent(QPaintEvent *event) {
QStyleOption opt;
opt.init(this);
QPainter p(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}
4、设软件名称为BOSS,在使用 this->setWindowState(Qt::WindowFullScreen); 后,软件会全屏显示,但是如果这时候使用Qt的系统弹窗,依旧会跳出软件的标题栏。如QMessageBox,Dialog之类;不好的地方是不美观和如果此时又开着另外一个软件(设名称为A),点击到标题栏的话会切换到那个软件上。隐藏或者关闭A软件可以切换回BOSS软件。
5、Qt cmake 添加动态库:
LINK_LIBRARIES("-lprotobuf")
6、传递引用、指针的过程中有可能引起混乱
比如:Type是一个小的数据类,MyStruct是一个大数据结构,包含Type数据类的指针,而B类有个函数是:
void B::fun( Type * b)
{
C c;
MyStruct struct;
struct.d = b;
c.fun(struct);
}
C类的fun函数是
void C::fun( MyStruct * b)
{
b.d = a; // a 是C类中的成员;
}
那么此时需要通过调用B类对象的接口 fun 去获取C类中a的值,就会出现混淆。
Type a;
B b;
b.fun(&a);
a并没有获得数据,获得数据的是B类中的结构体实例 struct中的d,因为在C类中并没有给传递进函数的结构体b的d成员指向的区域赋值,而是修改了d指向区域。
7、::basename(char * filename) 可以通过函数basename获取一串路径字符串中的最后一个
例如:
char path[] = "/Asia/Chinese/Guangdong/Shenzhen";
char newpath[] = ::basename(path);
此时的 newpath == “ShenZhen”
8、 修改按钮的响应点击范围和背景图片一致, 以下是lambda 表达式,也可以改写为函数的形式
/* 根据按钮背景图片设置按钮的响应范围 */
auto SetButtonMask=[](QPushButton *btn, QString picture)->void{
QImage img(picture);
QPixmap maps = QPixmap::fromImage(img.scaled(btn->size()));
btn->setMask(maps.mask());//只响应事件的区域/
};
SetButtonMask(ui->left_btn_,":/image/image/left.png");
SetButtonMask(ui->right_btn_,":/image/image/right.png");
SetButtonMask(ui->front_btn_,":/image/image/top.png");
SetButtonMask(ui->left_front_btn_,":/image/image/left-top.png");
SetButtonMask(ui->right_front_btn_,":/image/image/right-top.png");
9、 两个文件重复定义了一个类型引起冲突:
文件: a.h
typedef unsigned int uint32
文件 :b.h
typedef int uint32
文件:b.cpp
#include "a.h"
#include "b.h"
uint32 b::fun(){ }
一个是unsigned int 一个是int ,这时候就会有冲突产生,
error: conflicting declaration "typedef unsigned int uint32"
但如果两个文件中关于uint32都是同一个类型就不会产生冲突
typedef unsigned int uint32
10、编译器压栈顺序的差异
1)、
例如以下代码是A类的构造函数,其中sub_、serial_、name是A类的成员:
A::A(int num, std::string text):
sub_(num),
serial_(sub_->GetSerial()),
name(text)
{
}
等待sub_初始化完成后,调用其接口GetSerial()获取serial_构造函数所需要的指针,让serial_进行初始化。
这代码看起来并且运行起来也没有问题,但是~~~在一些电脑上就是编译不通过,需要等待A类构造函数完全运行完毕后才可正确初始化sub_成员,不然GetSerial()获取出来的就是一个空的指针,导致程序崩溃。
2)、
QVariantMap srcMap;
QVariantMap destMap;
for(auto key: srcMap.keys())
{
destMap.insert(key.remove("sss"), srcMap.value(key));
}
假设srcMap当中存在1个键值对,“sssOK" = “ni hen shuai”
在虚拟机编译出来的,会先执行srcMap.value(Key) ,此时key = “sssOK”,获取到的字符串为:“ni hen shuai”,再执行key.remove(“sss”),key = “OK”,那destMap中塞入的键值对则为:“OK” = “ni hen shuai”
而在另外的编译上,可能会执行key.remove(“sss”),此时key = “OK”,再执行srcMap.value(Key) , srcMap当中由于没有"OK"字符串,那么获取出来的字符串为空,那destMap中塞入的键值对则为:“OK” = “”
后续应注意这类型的写法,建议先取一个变量获取值后,再对key进行改写。
11、按下Ctrl+c 仍然无法关闭程序,可能是某个线程无法退出的缘故,需仔细需要运行线程的类的析构函数,是否有写上释放线程资源的