Как подключить сигнал от нити к слоту?

Я просто хочу подключить сигнал внутри потока к слоту в основном потоке для обработки изменений пользовательского интерфейса.

Это в основном текущее состояние моего потока, ничего особенного, но это просто для целей тестирования 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.

0

Решение

Кажется, что в этом случае был просто факт, что я использую std :: wstring в качестве аргумента в сигнале без предварительной регистрации типа и после добавления следующей строки qRegisterMetaType<std::wstring>("std::wstring"); к коду все работало как положено.

Если бы я читал консоль вывода более внимательно, я бы решил проблему без особых хлопот, поскольку было четко заявлено, что:
QObject::connect: Cannot queue arguments of type 'std::wstring'

Проще говоря, читайте вывод компилятора и не будьте глупыми, как я 🙂

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector