gpt4 book ai didi

c++ - 如何删除 QSharedPointer

转载 作者:行者123 更新时间:2023-11-28 05:36:31 25 4
gpt4 key购买 nike

我已经围绕 QTextEdit 编写了一个包装器,以便像使用 QIODevice 一样使用它。我希望能够对同一个 QTextEdit 使用多个包装器,因此我可以对每个包装器使用不同的文本颜色。

为了使这个包装器线程安全,我添加了一个 QMutex 来保护 QTextEdit 的使用。但是我在想我必须只使用一个互斥量来保护一个 QTextEdit。

我最终得到以下实现,使用 QSharedPointer 来保护 QTextEdit。

texteditiodevice.h

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;
};

texteditiodevice.cpp

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。

谢谢你的帮助

最佳答案

只要共享指针在静态 mutexes 映射中,它就永远不会被释放,mutexes 的生命周期就是程序的生命周期。

如果你想真正删除一个互斥锁,你必须从mutexes映射中移除它。

关于c++ - 如何删除 QSharedPointer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38185424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com