Я просто хочу подключить сигнал внутри потока к слоту в основном потоке для обработки изменений пользовательского интерфейса.
Это в основном текущее состояние моего потока, ничего особенного, но это просто для целей тестирования atm:
// synchronizer.h
class Synchronizer : public QObject
{
Q_OBJECT
public:
Synchronizer();
signals:
void newConnection(std::wstring id);
private:
QTimer timer;
private slots:
void synchronize();
}
// synchronizer.cpp
Synchronizer::Synchronizer()
{
connect(&timer, SIGNAL(timeout()), this, SLOT(synchronize()));
timer.start();
}
void Synchronizer::synchronize()
{
emit newConnection(L"test");
}
А вот как выглядит мое MainWindow:
// mainwindow.h
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
Synchronizer synchronizer;
private slots:
void addConnection(std::wstring id);
}
// mainwindow.cpp
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(&synchronizer, SIGNAL(newConnection(std::wstring)),
this, SLOT(addConnection(std::wstring)));
QThread *thread = new QThread;
// The problems starts here?
synchronizer.moveToThread(thread);
thread->start();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::addConnection(std::wstring id)
{
// Add a new connection to QListWidget
ui->connectionList(QString::fromStdWString(id));
}
Если я уберу там строки:
synchronizer.moveToThread(thread);
thread->start();
кажется, все работает, как ожидалось, то есть новый элемент добавляется каждую секунду в QListWidget, но как только я перемещаю объект синхронизатора в поток, он просто перестает работать. Я бы предположил, что это как-то связано с контекстом подключения, но я не совсем уверен, как этого добиться, поскольку я довольно новичок в Qt.
Кажется, что в этом случае был просто факт, что я использую std :: wstring в качестве аргумента в сигнале без предварительной регистрации типа и после добавления следующей строки qRegisterMetaType<std::wstring>("std::wstring");
к коду все работало как положено.
Если бы я читал консоль вывода более внимательно, я бы решил проблему без особых хлопот, поскольку было четко заявлено, что:
QObject::connect: Cannot queue arguments of type 'std::wstring'
Проще говоря, читайте вывод компилятора и не будьте глупыми, как я 🙂
Других решений пока нет …