QTextEdit在附加文本时崩溃

时间:2016-06-02 09:30:45

标签: c++ qt

我正在开发一个运行脚本和显示脚本的应用程序,结果是“Shell Window”。此窗口包含QTextEdit,其中附加了所有脚本输出。

该脚本可能会将数据附加到两个QTextStreamouterr

要让QTextStream使用QTextEdit作为输出,我使用了TextEditIODevice类(下面的源代码)。

脚本在VirtualMachine类的一个单独的线程中运行(未提供源)。

我的问题是,在将数据附加到QTextEdit时,程序会随机崩溃。

这是崩溃的屏幕截图:

debugger

有人已经有这个问题吗?你知道怎么解决吗?

感谢您的帮助解决了这个问题!

TextEditIODevice

头文件

class TextEditIODevice : public QIODevice
{
    Q_OBJECT

public:
    TextEditIODevice(QTextEdit * qTextEdit, QColor color, QObject * parent);

    virtual ~TextEditIODevice();

protected:
    qint64 readData(char *data, qint64 maxlen);

    qint64 writeData(const char *data, qint64 len);

private:
    /**
     * @brief Pointer to QTextEdit
     */
    QPointer<QTextEdit> textEdit;

    /**
     * @brief Text color
     */
    QColor color;

    /**
     * @brief Shared pointer to QTextEdit associated mutex
     */
    QSharedPointer<QMutex> mutex;

    /**
     * @brief Storage for QTextEdit associated mutexes
     */
    static QMap<QPointer<QTextEdit>, QSharedPointer<QMutex>> mutexes;
};

源文件

QMap<QPointer<QTextEdit>, QSharedPointer<QMutex>> TextEditIODevice::mutexes;

TextEditIODevice::TextEditIODevice(QTextEdit * qTextEdit, QColor color, QObject * parent) :
    QIODevice(parent),
    textEdit(qTextEdit),
    color(color)
{
    open(QIODevice::WriteOnly | QIODevice::Text);

    qRegisterMetaType<QTextCharFormat>("QTextCharFormat");
    qRegisterMetaType<QTextBlock>("QTextBlock");
    qRegisterMetaType<QTextCursor>("QTextCursor");

    if(mutexes.contains(textEdit))
    {
        qDebug() << QString("[%1] Reuse previously created mutex").arg(textEdit->objectName());
        mutex = mutexes[textEdit];
    }
    else
    {
        qDebug() << QString("[%1] Create mutex").arg(textEdit->objectName());
        mutex = QSharedPointer<QMutex>(new QMutex());
        mutexes.insert(textEdit, mutex);
    }
}

TextEditIODevice::~TextEditIODevice()
{
}

qint64 TextEditIODevice::readData(char *data, qint64 maxlen)
{
    Q_UNUSED(data);
    Q_UNUSED(maxlen);
    return 0;
}



qint64 TextEditIODevice::writeData(const char *data, qint64 len)
{
    if(textEdit)
    {
        qDebug() << QString("[%1] Wait for lock").arg(textEdit->objectName());
        mutex->lock();
        qDebug() << QString("[%1] Append text : %2").arg(textEdit->objectName()).arg(data);
        const QColor lastColor = textEdit->textColor();
        textEdit->setTextColor(color);
        textEdit->append(QString(data));
        textEdit->setTextColor(lastColor);
        qDebug() << QString("[%1] Unlock mutex").arg(textEdit->objectName());
        mutex->unlock();
    }

    return len;
}

0 个答案:

没有答案