gpt4 book ai didi

c++ - 找到 `destroyed(QObject*)`信号的发送者

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:38:32 27 4
gpt4 key购买 nike

我目前在想如何合理使用QObject::destroyed(QObject*) signal .

观察

我注意到 QWidget -派生对象的处理方式略有不同。考虑以下小型独立编译示例:

/* sscce.pro:
QT += core gui widgets
CONFIG += c++11
TARGET = sscce
TEMPLATE = app
SOURCES += main.cpp
*/

#include <QApplication>
#include <QPushButton>
#include <QTimer>
#include <QtDebug>

int main(int argc, char *argv[]) {
QApplication app(argc, argv);

QPushButton *button = new QPushButton;
QObject::connect(button, &QPushButton::destroyed,
[=](QObject *o) { qDebug() << o; });

delete button;

QTimer *timer = new QTimer;
QObject::connect(timer, &QTimer::destroyed,
[=](QObject *o) { qDebug() << o; });

delete timer;

return app.exec();
}

这是它的输出:

QWidget(0x1e9e1e0)QObject(0x1e5c530)

So presumably, the signal is emitted from QObject's d-tor, so only the QObject base remains when the slot is called for the QTimer. However, QWidget's d-tor seems to intercept as it still identifies itself as a QWidget from the slot.

And the problem

Let's assume we have a timer pool that organizes a couple of timers in a QList<QTimer *>:

struct Pool {
QTimer *getTimer() {
return timers.at(/* some clever logic here */);
}

QList<QTimer *> timers;
};

现在,一个粗心的用户可能会删除借给他/她的计时器。好吧,我们可以使用react并简单地从列表中删除该计时器。插槽可以解决问题:

Pool::Pool() {
/* for each timer created */
connect(theTimer, SIGNAL(destroyed(QObject*),
this, SLOT(timerDestroyed(QObject*));
}

void Pool::timerDeleted(QObject *object) {
QTimer *theTimer = /* hrm. */
timers.removeOne(theTimer);
}

但是现在呢?嗯。调用插槽时,QTimer已经处于破坏状态并且部分被破坏 - 只有它的 QObject基地仍然存在。所以我坚决不能 qobject_cast<QTimer *>(object) .

为了解决这个问题,我想到了以下技巧:

  1. 商店 QObject在列表中。然后每次我使用列表中的项目时我都不得不沮丧。这可以使用 static_cast 来完成, 不过据我所知只会有 QTimer s 在列表中,所以不需要 dynamic_castqobject_cast .
  2. Insteat of removeOne使用 iterator 遍历列表然后比较每个 QTimer项目直接到 QObject .然后使用 QList::erase等等。
  3. static_cast甚至 reinterpret_cast QObjectQtimer尽管如此。

我该怎么办?

谢谢,圣诞快乐,新年快乐:-)[*]

[*]:当这个问题完成后会清理它。

最佳答案

如果您正在寻找技巧,您可以简单地使用基本 QObject objectName 并基于它删除已销毁的计时器。

关于c++ - 找到 `destroyed(QObject*)`信号的发送者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34499097/

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