Skip to content

Conversation

suchone
Copy link

@suchone suchone commented Sep 28, 2025

QObject: Fixed QObject::connect connection type has different behaviors when using Qt::AutoConnection and Qt::QueuedConnection in cross-thread

For example:

class MyThread : public QThread
{
Q_OBJECT
public:
void run() override
{
QMap<int, int> result;

	//do something, then emit signal after task finished
	emit taskFinished(result);
}

signals:
void taskFinished(const QMap<int, int>& result);
};

class MyWidget : public QWidget
{
Q_OBJECT
public:
MyWidget()
{
MyThread* myThread = new MyThread();

	//If connection type is Qt::QueuedConnection, the taskFinished(result) signal can be triggered normally and the slot can be executed normally
	QObject::connect(myThread, &MyThread::taskFinished, this, &MyWidget::onTaskFinished, Qt::QueuedConnection);

	//If not set connection type (Qt::AutoConnection as default), when thread emit taskFinished(result) it will output error
	//QObject::connect: Cannot queue arguments of type 'QMap<int,int>'
	//(Make sure 'QMap<int,int>' is registered using qRegisterMetaType().)
	QObject::connect(myThread, &MyThread::taskFinished, this, &MyWidget::onTaskFinished);

	myThread->start();
}

public slots:
void onTaskFinished(const QMap<int, int>& result)
{
//do something
}
};

…iors when using Qt::AutoConnection and Qt::QueuedConnection in cross-thread

For example:

class MyThread : public QThread
{
	Q_OBJECT
public:
	void run() override
	{
		QMap<int, int> result;

		//do something, then emit signal after task finished
		emit taskFinished(result);
	}

signals:
	void taskFinished(const QMap<int, int>& result);
};

class MyWidget : public QWidget
{
	Q_OBJECT
public:
	MyWidget()
	{
		MyThread* myThread = new MyThread();

		//If connection type is Qt::QueuedConnection, the taskFinished(result) signal can be triggered normally and the slot can be executed normally
		QObject::connect(myThread, &MyThread::taskFinished, this, &MyWidget::onTaskFinished, Qt::QueuedConnection);

		//If not set connection type (Qt::AutoConnection as default), when thread emit taskFinished(result) it will output error
		//QObject::connect: Cannot queue arguments of type 'QMap<int,int>'
		//(Make sure 'QMap<int,int>' is registered using qRegisterMetaType().)
		QObject::connect(myThread, &MyThread::taskFinished, this, &MyWidget::onTaskFinished);

		myThread->start();
	}

public slots:
	void onTaskFinished(const QMap<int, int>& result)
	{
		//do something
	}
};
Copy link

cla-assistant bot commented Sep 28, 2025

CLA assistant check
Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.


txdy seems not to be a GitHub user. You need a GitHub account to be able to sign the CLA. If you have already a GitHub account, please add the email address used for this commit to your account.
You have signed the CLA already but the status is still pending? Let us recheck it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

Successfully merging this pull request may close these issues.

1 participant