Qt QPlainTextEdit崩溃了

时间:2016-07-14 08:02:27

标签: c++ qt

我正在使用Logger窗口,这是一个继承自QPlainTextEdit的简单小部件。

现在我需要同时打印几条消息(我使用互斥锁使这个线程安全),但无论如何它都会崩溃。这是来自gdb的消息

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff56c5cb9 in QTextLine::draw(QPainter*, QPointF const&, QTextLayout::FormatRange const*) const ()
from /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5

我正在使用Qt 5.4,但尝试了Qt 5.7并且崩溃仍然存在。有人有提示吗?我应该继承其他小部件吗?

1 个答案:

答案 0 :(得分:0)

正如人们在上面评论的那样,问题可能在于你的做事方式。所以这里有关于如何处理你的情况的推荐方法:使用QThread,不要使用互斥锁。

Qt使用信号/插槽进行线程安全通信。关于如何快速入门的示例:

class A : public QObject
{
    Q_OBJECT

    // ...

public slots:
    void run();
}

你想要在另一个新线程中运行的任何类都需要一个“运行”插槽,你可以按你喜欢的方式调用它,但它是第一个在新线程中调用它的函数。实施如下:

// Create and start the thread
QThread *t = new QThread;
t->start();

// Create an object of your class and move it to the thread
A* a = new A();
a->moveToThread(t);

// Now actually run it in the thread through the signal slot system
QMetaObject::invokeMethod(a, "run", Qt::QueuedConnection);

我希望说清楚,如果您有任何问题请告诉我。