小技巧汇总

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 仍然无法关闭程序,可能是某个线程无法退出的缘故,需仔细需要运行线程的类的析构函数,是否有写上释放线程资源的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值