我正在开发一个运行脚本和显示脚本的应用程序,结果是“Shell Window”。此窗口包含QTextEdit
,其中附加了所有脚本输出。
该脚本可能会将数据附加到两个QTextStream
:out
和err
。
要让QTextStream
使用QTextEdit
作为输出,我使用了TextEditIODevice
类(下面的源代码)。
脚本在VirtualMachine
类的一个单独的线程中运行(未提供源)。
我的问题是,在将数据附加到QTextEdit
时,程序会随机崩溃。
这是崩溃的屏幕截图:
有人已经有这个问题吗?你知道怎么解决吗?
感谢您的帮助解决了这个问题!
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;
}