一.在动态链接库的某声明为导出类中,头文件新定义一个静态成员方法。在被其他库引用时,报错无法解析的外部符号:
1.静态成员函数是在头文件中定义的,没有声明和实现分离,有博客指出工程包含一次等于存在一份,链接器不知道链接哪一个。此时,我其他的静态成员变量也是这么处理的,并没有报此错。我将声明实现分离,清理重新编译未能解决此问题。其实,头文件包含是有防止重复包含措施的,pragma once 以及宏定义处理等;
2.我怀疑是编译器问题,重启,未解决;
3.注释掉该函数的调用,编译成功。再取消注释,编译居然成功。由此可见,仍旧是编译器问题。
结论:一些莫名其妙的错需要莫名其妙的操作来解决。
二、Qt信号槽使用QMap传参,moc_XXX文件报错,无法将参数QMap<A,B>转换成QMap<A,B>:
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++的删除。