有一个类QNetworkReply的对象.有一个插槽(在某些其他对象中)连接到其finished()信号.信号是同步的(默认值).只有一个主题.
在某些时刻,我想摆脱两个对象.没有更多的信号或任何东西.我希望他们走了.好吧,我想,我会用的
delete obj1; delete obj2;
Run Code Online (Sandbox Code Playgroud)
但我真的可以吗?~QObject的规格说:
等待传递挂起事件时删除QObject可能会导致崩溃.
什么是"待定事件"?这是否意味着当我打电话给我时delete,已经有一些"未决事件"要发送,并且它们可能会导致崩溃,我无法确定是否有任何?
所以我要说我打电话:
obj1->deleteLater(); obj2->deleteLater();
Run Code Online (Sandbox Code Playgroud)
为了安全起见.
但是,我真的很安全吗?该deleteLater补充说,将在主回路控制时到达那里进行处理的事件.是否有一些待处理事件(信号)obj1或obj2已经存在,等待在处理deleteLater 之前在主循环中处理?那将是非常不幸的.我不想编写"有点删除"状态的代码检查,并忽略所有插槽中的传入信号.
Qt文档指出信号和槽可以是direct,queued和auto.
它还声明,如果拥有插槽的对象'生命'在与拥有信号的对象不同的线程中,则发出此类信号就像发布消息一样 - 信号发出将立即返回,并且将在目标线程的事件循环中调用slot方法.
不幸的是,文档没有说明"生命"代表的是没有例子可用.我试过以下代码:
main.h:
class CThread1 : public QThread
{
Q_OBJECT
public:
void run( void )
{
msleep( 200 );
std::cout << "thread 1 started" << std::endl;
MySignal();
exec();
}
signals:
void MySignal( void );
};
class CThread2 : public QThread
{
Q_OBJECT
public:
void run( void )
{
std::cout << "thread 2 started" << std::endl;
exec();
}
public slots:
void MySlot( void )
{
std::cout << "slot called" << std::endl;
} …Run Code Online (Sandbox Code Playgroud) 我在使用Qt信号时遇到问题.
我不明白怎么做DirectConnection和QueuedConnection有效?
如果有人会解释何时使用其中的哪一个(示例代码将被赞赏),我将感激不尽.
Qt信号可以是公共的还是私人的?我可以创建只在课堂内看到的内部信号吗?
更新:我有一个带有一些内部信号的课程.如何让这些信号对其他类不可见(封装和信息隐藏)?
当实现类已经从QObject/QWidget中获取时,如何在抽象类/接口中声明Qt信号?
class IEmitSomething
{
public:
// this should be the signal known to others
virtual void someThingHappened() = 0;
}
class ImplementEmitterOfSomething : public QWidget, public IEmitSomething
{
// signal implementation should be generated here
signals: void someThingHappended();
}
Run Code Online (Sandbox Code Playgroud) 我们正在使用提供信号和插槽的Qt,我觉得非常方便.然而,强大的力量带来了巨大的责任,我认为很容易滥用这个功能.
是否有信号槽使用的最佳实践?我很难以这种方式找到一些通用指南.一些问题(我有明确的意见,但并非所有团队成员都同意):
signal displayInfoScreen()必须由显示信息屏幕的插槽处理.关于何时应该/不应该使用信号的任何其他意见都是非常受欢迎的!
或其他方式来表达我的问题(虽然它没有解决我的问题):'QObject :: QObject'无法访问类'QObject'中声明的私有成员
我的课程中需要SIGNALs和SLOTS功能,但我认为不可能从中衍生出来QObject?
class MyClass
{
signals:
importantSignal();
public slots:
importantSlot();
};
Run Code Online (Sandbox Code Playgroud)
问题似乎是我需要派生QObject来使用信号和插槽......但我需要默认的构造函数MyClass.但由于以下特性,我无法构造它们QObject:
No Copy Constructor或Assignment Operator.
我试了很多......
所以我的上课看起来像这样:
#include <QObject>
class MyClass: public QObject
{
Q_OBJECT
public:
explicit MyClass(QObject *parent = 0); //autogenerated by qtcreator for QObject derived class
MyClass(const MyClass * other);
signals:
importantSignal();
public slots:
importantSlot();
};
Run Code Online (Sandbox Code Playgroud)
我需要默认的构造函数MyClass.
那么有没有可能避免"'QObject :: QObject'无法访问类'QObject'中声明的私有成员"错误?
或者作为替代方案是否有可能没有使用信号和插槽QObject?
我很高兴有任何建议.
我有一个类服务器,我已经创建了一个加入的信号(QString名称).我在一个名为join(QString name)的函数中调用它,但是我收到了错误
Server.o:在函数
Server::join(QString)': Server.cpp:(.text+0x48): undefined reference toServer :: joined(QString)'collect2:ld返回1退出状态
这是我的头文件的样子:
#ifndef SERVER_H
#define SERVER_H
#include <QString>
#include <mqueue.h>
#include <QVector>
#include <QStringList>
#include "../src/messages.h"
class Server
{
public:
Server();
void start();
private:
void join(QString name);
char buf[MSG_SIZE], msgSend[MSG_SIZE];
QVector<mqd_t> mq_external;
QVector<QString> users;
mqd_t mq_central;
struct mq_attr attr;
signals:
void joined(QString name);
};
#endif // SERVER_H
Run Code Online (Sandbox Code Playgroud)
这是我的cpp文件:
#include "Server.h"
using namespace std;
Server::Server()
{
}
void Server::start(){
attr.mq_maxmsg = 100;
attr.mq_msgsize = MSG_SIZE;
attr.mq_flags = 0;
mq_unlink(CENTRALBOX);
mq_central = …Run Code Online (Sandbox Code Playgroud) 我在这里发布后:将信号和插槽关联到qcheckbox动态创建我需要关联:
• clicked()单击某个qCheckBox功能时的信号cliqueCheckBox(QTableWidget *monTab, int ligne, QCheckBox *pCheckBox)
要做到这一点,我必须使用QSignalMapper,经过两个小时试图了解它是如何工作的,我不能有一个好的结果,这是我做的代码,这显然是错误的:
QSignalMapper *m_sigmapper = new QSignalMapper(this);
QObject::connect(pCheckBox, SIGNAL(mapped(QTableWidget*,int, QCheckBox*)), pCheckBox, SIGNAL(clicked()));
QObject::connect(this, SIGNAL(clicked()), this, SLOT(cliqueCheckBox(QTableWidget *monTab, int ligne, QCheckBox *pCheckBox)));
m_sigmapper->setMapping(pCheckBox, (monTab,ligne, pCheckBox));
QObject::connect(m_sigmapper, SIGNAL(clicked()),this, SLOT(cliqueCheckBox(QTableWidget *monTab, int ligne, QCheckBox *pCheckBox)));
Run Code Online (Sandbox Code Playgroud)
你能解释一下,怎么样QSignalMapper?我真的不明白要联系到什么:(
我有一个class(MyClass)从Qt内置对象(QGraphicsTextItem)继承其大部分功能.QGraphicsTextItem从中间接继承QObject.MyClass还实现了一个接口MyInterface.
class MyClass : public QGraphicsTextItem, public MyInterface
Run Code Online (Sandbox Code Playgroud)
我需要能够使用connect和disconnect开启MyInterface*.但现在看来,connect并disconnect只在工作QObject*实例.由于Qt不支持从QObject的派生类多继承,我不能得到MyInterface从QObject.(无论如何,这对于界面也没有多大意义.)
有一个问题的讨论在网上,但IMO所提出的解决方案是在通常情况下(访问通过其接口的对象)相当无用的,因为你无法连接的信号和槽MyInterface*,但必须将它转换为派生类型.由于MyClass是许多MyInterface衍生类中的一个,这将需要"代码 - 臭"如果 - 这个 - 演绎 - 否则 - 如果 - 那个 - 演绎到那个语句并且破坏了接口的目的.
这个限制有一个很好的解决方案吗?
更新:我注意到,如果我dynamic_cast一MyInterface*到QObject*(因为我知道所有MyInterface的派生类也最终从继承QObject,它似乎工作即:
MyInterface *my_interface_instance = GetInstance();
connect(dynamic_cast<QObject*>(my_interface_instance), …Run Code Online (Sandbox Code Playgroud)