- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我目前在想如何合理使用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.
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)
.
为了解决这个问题,我想到了以下技巧:
QObject
在列表中。然后每次我使用列表中的项目时我都不得不沮丧。这可以使用 static_cast
来完成, 不过据我所知只会有 QTimer
s 在列表中,所以不需要 dynamic_cast
或 qobject_cast
.removeOne
使用 iterator
遍历列表然后比较每个 QTimer
项目直接到 QObject
.然后使用 QList::erase
等等。static_cast
甚至 reinterpret_cast
QObject
到 Qtimer
尽管如此。我该怎么办?
谢谢,圣诞快乐,新年快乐:-)[*]
[*]:当这个问题完成后会清理它。
最佳答案
如果您正在寻找技巧,您可以简单地使用基本 QObject objectName 并基于它删除已销毁的计时器。
关于c++ - 找到 `destroyed(QObject*)`信号的发送者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34499097/
以下是我遇到的编译错误: /usr/lib/qt-3.3/include/qobject.h: In copy constructor Product::Product(const Product&)
class CHIProjectData : public QObject { public: CHIProjectData(); CHIProjectData(QMap aProje
这个问题在这里已经有了答案: Could I have copy constructor for subclass of QObject? (3 个答案) 关闭 7 年前。 我收到错误: C:\Qt
将一个项目从 Qt4 迁移到 Qt5 我得到了这个错误,我已经研究过,显然你不能从 QObject 创建一个派生类的复制构造函数(这太不可思议了,因为这段代码不是我的,它应该在以前的版本中编译).复制
我试图返回一个派生自 QObject 的类,但出现以下错误 Error : 'QObject::QObject' : cannot access private member declared in
我正在编写一些派生自 QObject 的 Qt 类,它看起来像: class A : public QObject { Q_OBJECT public: A() : QObject() {}
考虑以下代码: #include class A : public QObject { Q_OBJECT public: A(QObject* parent = 0)
我似乎需要 QObject 类型的 p 实例,我已经扩展了 QObject 并在 fileprocessor.h 中定义了关键字 Q_OBJECT,我不确定我还能做什么。 -文件处理器.h #ifnd
我有一个继承 QObject 的类 BatchItem,还有几个继承自 BatchItem 的类: #ifndef BATCHITEM_H #define BATCHITEM_H #include
这是代码: void invokeQMLFunction2Arg(QObject * object, QString func, QVariant p1, QVariant p2) { QMe
我读过 documentation对于 QObject::connect(对于 Qt 5.4),但我对重载有疑问 QMetaObject::Connection QObject::connect(co
我最近一直在使用QTCreator,我爱上了ATM。不幸的是,我想将它与 Python 一起使用,但我遇到了问题。我遇到的最大问题是发现我的应用程序上下文的子级返回 None。 main.py imp
使用 #include 有什么区别吗?和 #include ? 这两个似乎都有效,所以必须有一些原因来说明为什么 #include是首选吗? 最佳答案 任何不带 .h 扩展名的标准 Qt 头文件都保证
我写的Python代码看起来像这样: class Regularblock(QGraphicsItem): def __init__(self): super(QGraphic
Qt 框架有一个 signal for all QObjects which is emmited before destruction那个QObject。此事件可用于在它指向的对象被销毁时自动清空一
我想创建 SerialPort 类,它可以自动接收消息,然后发出信号。 但是当我编译它时显示错误信息: error: 'QObject' is an ambiguous base of 'Serial
(C++/Qt) 我有一个指向 QObject 的智能指针。让我们说一个 QWeakPointer。由于某些外部原因(可能发生在另一个对象中或由于某个事件),指向的对象可能会被销毁。因为我有一个智能指
QObject 析构函数的 Qt 引用说: 进出该对象的所有信号都会自动断开,该对象的任何未决发布事件都会从事件队列中删除。但是,使用 deleteLater() 通常比删除更安全直接一个 QObje
您好,我需要从后台进行一些套接字通信,我为此使用了QtConcurrent::run,但给了我警告。 QObject: Cannot create children for a parent that
如何打破 QObject 的父子所有权?似乎不再有明确的方法来做到这一点。打电话就够了 QObject::setParent(NULL) 最佳答案 你是对的。制作 QObject一个孤儿,简单地做 /
我是一名优秀的程序员,十分优秀!