我在QTextEdit周围编写了一个包装器,就像QIODevice一样使用它。我希望能够使用具有相同QTextEdit的多个包装器,因此我可以对每个包装器使用不同的文本颜色。
为了使这个包装器线程安全,我添加了一个QMutex来保护QTextEdit的使用。但我想我必须只使用一个互斥锁来保护一个QTextEdit。
我最终得到以下实现,使用QSharedPointer来保护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))
mutex = mutexes[textEdit];
else
{
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)
{
mutex->lock();
const QColor lastColor = textEdit->textColor();
textEdit->setTextColor(color);
textEdit->append(QString(data));
textEdit->setTextColor(lastColor);
mutex->unlock();
}
return len;
}
我想知道从mutexes
映射中删除QSharedPointer实例的位置,以便删除QMutex。
感谢您的帮助
答案 0 :(得分:1)
只要共享指针位于静态mutexes
映射中,它就永远不会被释放,mutexes
的生命周期就是程序的生命周期。
如果您想要实际删除互斥锁,则必须将其从mutexes
映射中删除。