我反复看到有人没有调用插槽的问题.我想收集一些最常见的原因.所以也许我可以帮助别人并避免许多多余的问题.
信号/插槽连接不起作用的原因是什么?如何避免这些问题?
我无法理解Q_PROPERTY的用法.Q_PROPERTY如何帮助使程序防御?它是干什么用的?我见过论坛,但真的无法进行论坛.我已经理解了这个例子,但不是它的用法.
这是一个例子,我从中获得了什么.我知道阅读会给予阅读权限.
write属性将赋予仅写入权限.但它有什么需要呢?有人可以举例说明吗?
class MyClass : public QObject
{
Q_OBJECT
Q_PROPERTY(Priority priority READ priority WRITE setPriority NOTIFY priorityChanged)
Q_ENUMS(Priority)
public:
MyClass(QObject *parent = 0);
~MyClass();
enum Priority { High, Low, VeryHigh, VeryLow };
void setPriority(Priority priority)
{
m_priority = priority;
emit priorityChanged(priority);
}
Priority priority() const
{ return m_priority; }
signals:
void priorityChanged(Priority);
private:
Priority m_priority;
};
Run Code Online (Sandbox Code Playgroud) 在这里,我的信号声明:
signals:
void mySignal(MyClass *);
Run Code Online (Sandbox Code Playgroud)
以及我如何使用它:
MyClass *myObject=new myClass();
emit mySignal(myObject);
Run Code Online (Sandbox Code Playgroud)
这是我的问题:谁负责删除myObject:
发件人代码,如果在使用myObject之前删除了什么?悬挂指针
插槽连接到信号,如果没有插槽或连接到信号的多个插槽怎么办?内存泄漏或悬空指针
Qt如何在其内置信号中管理这种情况?它是否使用内部引用计数?
你最好的做法是什么?
或其他方式来表达我的问题(虽然它没有解决我的问题):'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) 在我的表格中,我有一个QListWidget包含可检查的内容QListWidgetItems.我正在寻找一种方法来捕获QListWidgetItem被检查/未检查的事件.我没有看到任何这样的信号,但也许我错了.用什么我目前做的是QListWidget::itemClicked()信号和检查checkState的QListWidgetItem,但是这不是我想要的,因为这种事件发生的项目被点击任何时候,不要只是去对号翻转.谁能提供一些帮助?谢谢!
我是Qt的新手.大多数时候,Qt开发人员需要使用信号和插槽进行对象通信.到目前为止,我已经看到了两种连接信号和插槽的方法.
1)QObject::connect(scrollBar, SIGNAL(valueChanged(int)),label, SLOT(setNum(int)));
2)connect(scrollBar, SIGNAL(valueChanged(int)),label, SLOT(setNum(int)));
Run Code Online (Sandbox Code Playgroud)
两者之间的确切区别是什么?为什么我们必须在第一种方法中为QObject加前缀?
我正在开发一个将文件内容上传到服务器的应用程序.
要将文件上传到服务器,我使用的是"QNetworkAccessManager"类.由于它以异步方式工作,我通过使用QEventLoop将其更改为以同步方式工作.
Class FileTransfer
{
Public :
QNetworkAccessManager mNetworkManager;
Void Upload(QNetworkRequest request, QIODevice *data)
{
responce = mNetworkManager.put(request, data);
EventLoop.exec();
ReadResponce(responce);
}
Void Stop()
{
responce ->close();
}
}
Run Code Online (Sandbox Code Playgroud)
在我的示例应用程序中,我有2个窗口.第一个选择文件,第二个显示进度.
当用户在第一个窗口中单击上传按钮时,将显示第二个窗口,然后我创建FileTransfer对象并开始上传.
当用户关闭表单时上传文件,然后在窗口的析构函数中,我调用" FileTransfer " 的停止,然后删除' FileTransfer '对象.
但是这里的Upload()函数还没有完成,所以它会崩溃.
请帮助我:如何等待'stop() '函数,直到Upload()函数完成
我在这里发布后:将信号和插槽关联到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?我真的不明白要联系到什么:(
我想知道是否可以指定多种连接类型.例如,我希望我的连接类型是排队连接和唯一连接.是否可以在一个声明中指定?
QObject::connect(ptrSender,SIGNAL(..),ptrReceiver,SLOT(...),Queued-and-unique)
Run Code Online (Sandbox Code Playgroud)
更新:
根据海报的建议:
我试过用 Qt::QueuedConnection | Qt::UniqueConnection但是得到了
`Error 1 error C2664: 'QMetaObject::Connection QObject::connect(const QObject *,const char *,const QObject *,const char *,Qt::ConnectionType)' : cannot convert parameter 5 from 'int' to 'Qt::ConnectionType'
Run Code Online (Sandbox Code Playgroud) qt ×10
qt-signals ×10
c++ ×8
qobject ×4
qtcore ×2
slot ×2
qlistwidget ×1
qproperty ×1
qt-slot ×1
signals ×1