vs+Qt编译工程中遇到的一些问题及处理汇总

一.在动态链接库的某声明为导出类中,头文件新定义一个静态成员方法。在被其他库引用时,报错无法解析的外部符号:

1.静态成员函数是在头文件中定义的,没有声明和实现分离,有博客指出工程包含一次等于存在一份,链接器不知道链接哪一个。此时,我其他的静态成员变量也是这么处理的,并没有报此错。我将声明实现分离,清理重新编译未能解决此问题。其实,头文件包含是有防止重复包含措施的,pragma once  以及宏定义处理等;

2.我怀疑是编译器问题,重启,未解决;

3.注释掉该函数的调用,编译成功。再取消注释,编译居然成功。由此可见,仍旧是编译器问题。

结论:一些莫名其妙的错需要莫名其妙的操作来解决。

 

二、Qt信号槽使用QMap传参,moc_XXX文件报错,无法将参数QMap转换成QMap:

1.第一个反应是同样的类型怎么无法转换呢?其实函数参数的定义默认是值传递,QMap是个模板类型,在不知道其拷贝构造的时候,是无法转换的。解决方法:使用指针或者引用传值。建议使用指针,这样更明确,以免在多线程环境里错误的使用。

三、在C++编程中,A类中包含一个B类,而B类有一个指针指向包含自己的A类,如果头文件互相包含,编译不过,我这里报错是缺少;号。解决办法:B类头文件中使用类声明A,在实现文件中包含其头文件。(注意:#progma once 并不能解决该问题)

 

四、删除原有布局并及控件、重新布局setlayout无效:

	if (realTimeView->layout()) {
				QLayoutItem* item = NULL;
				while (NULL != (item = realTimeView->layout()->takeAt(0))) {
					item->widget()->deleteLater();//释放原有的
					item = NULL;
				}
		
				realTimeView->layout()->deleteLater();
			}
			QApplication::processEvents();


//中间创建新的控件
QFrame* realTimeStationView = new QFrame();
QVBoxLayout* lay = new QVBoxLayout(realTimeStationView);

	QHBoxLayout* realTimeViewLay = new QHBoxLayout();
	realTimeView->setLayout(realTimeViewLay);
	realTimeViewLay->addWidget(realTimeStationView);
			
	realTimeStationView->show();

当我触发这个函数的时候,先对realtimeview进行判断,若有则删除原有控件及布局,然后重新创建新的布局再设置。但我发现没用。因为qt是事件驱动,所以我在中间加了processEvents();但依旧没效果。qt说 deletelater()会在空闲时处理。我的理解就是事件队列中执行。但抱着怀疑的态度,将deletelater 用c++的 delete执行。居然重新布局生效了。也就是说,deletelater(),之后尽管加了processEvents(),他也不一定会立马删除,可能会滞后很久。所以,需要立即删除的东西,不能使用deletelater(),而是c++的删除。

你可能感兴趣的:(VS+Qt,编译问题)