首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何删除QSharedPointer

如何删除QSharedPointer
EN

Stack Overflow用户
提问于 2016-07-04 21:00:36
回答 0查看 913关注 0票数 0

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

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

我在下面的实现中结束,使用一个QSharedPointer来保护QTextEdit。

texteditiodevice.h

代码语言:javascript
复制
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

代码语言:javascript
复制
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。

谢谢你的帮忙

EN

回答

页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38185424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档