根据http://doc.qt.io/qt-5/qpointer.html,QPointer非常有用。但我发现在以下情况下它可能效率低下:
如果我想要显示标签三次或做其他事情,我必须使用
if(label) label->show1();
if(label) label->show2();
if(label) label->show3();
if(label) { label->show1();label->show2();label->show3(); }
仅仅因为label->show1();
或label->show2();.
除了三个ifs之外,还有一种漂亮的方法可以获得相同的功能吗?
另一个问题是,在if(标签)之后销毁标签时,if(label) label->show1();
仍然是错误的吗?
我没有多线程程序的经验。任何帮助表示赞赏。 ;)
答案 0 :(得分:6)
我认为唯一安全的方法是确保只从主/ GUI线程(即运行Qt事件循环的线程,在QApplication :: exec()中)访问QWidgets。
如果您的代码在不同的线程中运行,并且该代码需要显示/隐藏/无论什么,那么该代码需要创建一个QEvent对象(或其子类)并调用qApp-> postEvent()将该对象发送到主线程。然后,当Qt事件循环拾取并在主线程中处理该QEvent时,这就是代码可以安全地对QLabel执行操作的点。
或者(也许更简单),你的线程代码可以发出一个跨线程信号(如here所述)并让Qt在内部处理事件发布。这可能对你的目的更好。
答案 1 :(得分:0)
您的方法都不是线程安全的。您的第一个线程可能会执行if
语句,然后另一个线程将删除您的标签,然后您将进入if
语句并崩溃。
Qt提供了许多线程同步结构,您可能希望从QMutex开始,并在继续使用此程序之前了解有关线程安全的更多信息。
使用互斥锁会使你的函数看起来像这样:
mutex.lock();
label1->show();
label2->show();
label3->show();
mutex.unlock()
只要您的其他主题使用锁定相同的互斥锁对象,就会阻止您在显示标签时删除标签。