LINUX.ORG.RU

Qt4: использование connect в многопоточных приложениях


0

1

Есть класс

class A : public QwtPlot
{
   Q_OBJECT
   ...

protected slots:
   void conversionMouseCoordinates(int x, int y);
}

class B : public QwtPlotZoomer
{
   Q_OBJECT
   ...

signals:
   void sendMouseCoordinates(int x, int y);
}

A::A(QWidget *parent)
        :QwtPlot(parent)
{
   ...
   b = new B(this->canvas());
   connect(b, SIGNAL(sendMouseCoordinates(int, int)), this, SLOT(conversionMouseCoordinates(int, int)));
}

Всё работает нормально. При наследовании класса А дополнительно и от QThread:

class A : public QwtPlot, public QThread
{
   Q_OBJECT
   ...
}

Выдаётся:

ошибка: ссылка на ‘connect’ противоречива

С чем это связано? Как это победить?

>class A : public QwtPlot, public QThread

И QwtPlot и QThread наследуют QObject, логично что ссылка будет противоречива.

И что ты этим кодом хотел сказать?

Sectoid ★★★★★ ()

Имеем: множественное наследование от двух потомков QObject. Возможные решения: 1) явно указать, connect какого класса использовать, например QObject::connect 2)определить в своем классе функцию connect и прописать внутри QObject::connect

Хотя я бы ни при каких обстоятельствах не рекоммендовал наследовать от двух QOBject'ов. Насчет тредов думай сам, если понимаешь, что в треде будет выполняться только run(), можешь не слушать местных аналитиков

annulen ★★★★★ ()
Ответ на: комментарий от trex6

>Нельзя наследоваться от 2-х QObject-ов.

Теоретически, можно. Запрещено виртуально наследоваться от QObject

annulen ★★★★★ ()
Ответ на: комментарий от Sectoid

>> И QwtPlot и QThread наследуют QObject, логично что ссылка будет противоречива.

Как тогда унаследовать методы QThread, чтобы создать многопоточность?

minipooh ()
Ответ на: комментарий от minipooh

Отдельно создать QThread, внутри создать QwtPlot и все необходимые интерфейсы протянуть наружу.

trex6 ★★★★★ ()

А разве moc не ругается на наследование от двух QObject'ов?

KblCb ★★★★★ ()
Ответ на: комментарий от minipooh

>Как тогда унаследовать методы QThread, чтобы создать многопоточность?

Перефразирую: зачем для многопоточности наследовать QThread виджетом? Ты что-то делаешь сильно неправильно, давай исходную постановку.

Sectoid ★★★★★ ()

И да. Все QWidget'ы должны жить в одном потоке.

KblCb ★★★★★ ()
Ответ на: комментарий от minipooh

Как тогда унаследовать методы QThread, чтобы создать многопоточность?

Нафига наследовать?

//нить
QThread t;
//потомок QObject
QObject o;
//запускаем
t.run();
//делаем нить родителем QObject, тот в свою очередь выполняется в своей нитке (можно отдать в нитку целое дерев QObject'ов)
o.setParent(&t);

Сигналы со слотами коннектим позже или не забываем передать аргумент «Qt::QueuedConnection».

erfea ★★★★★ ()
Ответ на: комментарий от erfea

ЗЫ не забываем что ВСЕ виджеты выполняются в главной нитке, это обязатьльно!

erfea ★★★★★ ()
Ответ на: комментарий от erfea

Сорри немного наврал...

o.moveToThread(&t)

...давно блин с нитями не работал. И ещё не уверен (забыл) надо ли наследника QThread делать с переопределённым run(), для создания евент лупа, загугли.

erfea ★★★★★ ()
Ответ на: комментарий от rival

Решил освежить в голове, почитал доки... С какой-то версии это так, довольно древней. И у меня ещё одна ошибка, надо не run() вызывать а start(). Но суть остаётся той же. ЗЫ напрочь не помню, при Qt::AutoConnection способ передачи сигнала слоту определяется по факту или при вызове connect()?

erfea ★★★★★ ()
Ответ на: комментарий от rival

Спасибо, освежил. Может теперь запомню окончательно (повторенье - мать ученья). :)

erfea ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.