crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

karabura
  опции профиля:
сообщение 23.6.2009, 10:21
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 23.6.2009
Пользователь №: 843

Спасибо сказали: 0 раз(а)




Репутация:   0  


Проблема не оригинальная, следующая (я здесь нашёл в FAQ такую тему - но мне не подошло, она здесь для QT4):
Имеется главный поток, в виде формочки, на которой должна отображаться быстро меняющаяся информация, и поток,
который собственно эту информацию и достаёт (в бесконечном цикле). Главная форма нужна, дабы управлять потоком.
А поток обновляет информацию на главной формочке. Я попробовал вот так:
http://www.forum.crossplatform.ru/index.ph...%E6%E5%ED%E8%E5
не получилось, понятно, что вряд ли от QT4 получится в QT3.
Дайте пожалуйста ссылку, как проще это сделать в QT3 (или пример по существу).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
3 страниц V   1 2 3 >  
Начать новую тему
Ответов (1 - 22)
Litkevich Yuriy
  опции профиля:
сообщение 23.6.2009, 10:47
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(karabura @ 23.6.2009, 14:21) *
не получилось, понятно, что вряд ли от QT4 получится в QT3.
А что не получилось?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 23.6.2009, 10:51
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


karabura, а в Qt 3 нет сигналов и слотов или потоков или ты не знаешь как сделать emit сигнала в поток? Я вообще не понял в чем у тебя проблема.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
karabura
  опции профиля:
сообщение 23.6.2009, 11:28
Сообщение #4


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 23.6.2009
Пользователь №: 843

Спасибо сказали: 0 раз(а)




Репутация:   0  


объявление класса потока - в отдельном h файле,
class MThread:public QThread {
Q_OBJECT
....
....
virtual void run();
MThread ():QThread {...}
signals:
void sendWL(char *);
};


реализация в другом.

Теперь суть главной формы (пришлось залезть в файл .ui/frmMain.h):
в классе Form1

#include "../thread.h"
class Form1:public QMainWindow {
Q_OBJECT
MThread *mthread;
.....
.....
protected slots:
void setWL(char *);
...
...
};

void Form1::setWL(char *wl) {
...
}


В конструкторе главной формы:
Form1::Form1 (.......) {
...
...
mthread=new MThread();
connect(&mthread, SIGNAL( sendWL(char *) ), this, SLOT( setWL(char *) ))

}


компилятор выдаёт по русски:
.ui/frmMain.cpp: In constructor ‘Form1::Form1(QWidget*, const char*, uint)’:
.ui/frmMain.cpp:187: ошибка: нет подходящей функции для вызова ‘Form1::connect(MThread**, const char [16], Form1* const, const char [15])’
/usr/lib/qt/include/qobject.h:116: замечание: претенденты: static bool QObject::connect(const QObject*, const char*, const QObject*, const char*)
/usr/lib/qt/include/qobject.h:226: замечание: bool QObject::connect(const QObject*, const char*, const char*) const
Причина редактирования: используй тэг code
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Kagami
  опции профиля:
сообщение 23.6.2009, 12:05
Сообщение #5


Старейший участник
****

Группа: Участник
Сообщений: 601
Регистрация: 2.2.2009
Пользователь №: 523

Спасибо сказали: 101 раз(а)




Репутация:   9  


Цитата
connect(&mthread, SIGNAL( sendWL(char *) ), this, SLOT( setWL(char *) ))

Зачем ты берешь адрес от указателя?

Сообщение отредактировал Kagami - 23.6.2009, 12:07
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
karabura
  опции профиля:
сообщение 23.6.2009, 12:15
Сообщение #6


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 23.6.2009
Пользователь №: 843

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Kagami @ 23.6.2009, 15:05) *
Цитата
connect(&mthread, SIGNAL( sendWL(char *) ), this, SLOT( setWL(char *) ))

Зачем ты берешь адрес от указателя?

Прошу прощения за опечатку, конечно же ссылки там быть не должно, но тем не менее характер ошибки не меняется
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 23.6.2009, 12:28
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Цитата
но тем не менее характер ошибки не меняется

Как он может не поменяться, когда ошибка явно указывает на двойной указатель?:

‘Form1::connect(MThread**


Когда вторым объектом в connect является this указатель - его можно опустить:

connect(mthread, SIGNAL( sendWL(char *) ), SLOT( setWL(char *) ))


Кстати твой слот отработает в основном цикле, а не в потоке. Спроси меня почему.

Сообщение отредактировал SABROG - 23.6.2009, 12:30
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
karabura
  опции профиля:
сообщение 23.6.2009, 12:31
Сообщение #8


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 23.6.2009
Пользователь №: 843

Спасибо сказали: 0 раз(а)




Репутация:   0  


‘Form1::connect(MThread**


Цитата(SABROG @ 23.6.2009, 16:28) *
Кстати твой слот отработает в основном цикле, а не в потоке. Спроси меня почему.

Почему? Но слот то и должен отработать в основном цикле - он должен обновить инфу на лабеле.
Но это не компилится :(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 23.6.2009, 12:35
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


А нет, это я ошибся, у тебя сигнал из потока посылается, а не наоборот, тогда должно работать.

Цитата(karabura @ 23.6.2009, 13:31) *
Но это не компилится :(


Покажи ошибки. Подозрение у меня на тип char *
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
karabura
  опции профиля:
сообщение 23.6.2009, 12:37
Сообщение #10


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 23.6.2009
Пользователь №: 843

Спасибо сказали: 0 раз(а)




Репутация:   0  


убрал ссылку из connect:
connect(mthread, SIGNAL( sendWL(char *), SLOT( setWL(char *) ) );

всё равно вот это выдаётся компилятором:
.ui/frmMain.cpp: In constructor ‘Form1::Form1(QWidget*, const char*, uint)’:
.ui/frmMain.cpp:187: ошибка: нет подходящей функции для вызова ‘Form1::connect(MThread*&, const char [16], const char [15])’
/usr/lib/qt/include/qobject.h:116: замечание: претенденты: static bool QObject::connect(const QObject*, const char*, const QObject*, const char*)


Цитата(karabura @ 23.6.2009, 15:35) *
connect(mthread, SIGNAL( sendWL(char *), SLOT( setWL(char *) ) );
atic bool QObject::connect(const QObject*, const char*, const QObject*, const char*)

скобку в пост забыл, в исходниках она есть
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 23.6.2009, 12:38
Сообщение #11


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Покажи объявление mthread.

MThread*&


Ссылка на указатель. Это у тебя не так mthread объявлен?

MThread mthread;
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
karabura
  опции профиля:
сообщение 23.6.2009, 12:45
Сообщение #12


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 23.6.2009
Пользователь №: 843

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(SABROG @ 23.6.2009, 15:38) *
Покажи объявление mthread.

MThread*&


Ссылка на указатель. Это у тебя не так mthread объявлен?

MThread mthread;

Объявлен в классе основной формы:
MThread *mthread;

А в конструкторе формы я его создаю, перед коннектом
mthread=new MThread();
...
connect(mthread, SIGNAL( sendWL(char *) ), SLOT( setWL(char *) ) );
...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 23.6.2009, 13:01
Сообщение #13


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Выложи тут в архиве исходники.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
karabura
  опции профиля:
сообщение 23.6.2009, 13:09
Сообщение #14


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 23.6.2009
Пользователь №: 843

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(SABROG @ 23.6.2009, 16:01) *
Выложи тут в архиве исходники.

Там правда не всё, одного заголовочника нет - но это к сути отношения не имеет.
Прошу не издеваться над "сырым кодом" :) - я в QT впервые
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 23.6.2009, 13:11
Сообщение #15


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Цитата(karabura @ 23.6.2009, 14:09) *
Прошу не издеваться над "сырым кодом"


Если ты в Qt впервые, то зачем ты выбрал такую старую её версию? Издеваться никто не будет, а если будут, то тебе только на пользу, будешь знать как надо делать правильно ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
karabura
  опции профиля:
сообщение 23.6.2009, 13:14
Сообщение #16


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 23.6.2009
Пользователь №: 843

Спасибо сказали: 0 раз(а)




Репутация:   0  


Не получилось сразу загрузить[attachment=678:qtdesigner_copy.tar.gz]

Цитата(SABROG @ 23.6.2009, 16:11) *
Если ты в Qt впервые, то зачем ты выбрал такую старую её версию?
А я и не выбирал, она у меня по дефолту стояла, разве она не работоспособная? Я не совсем просто понимаю, чем она в контексте простейшей задачи хуже QT4?
Прикрепленные файлы
Прикрепленный файл  qtdesigner_copy.tar.gz ( 50.17 килобайт ) Кол-во скачиваний: 332
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 23.6.2009, 13:31
Сообщение #17


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Файл frmMain.h, видишь что там написано:

/****************************************************************************
** Form interface generated from reading ui file 'frmMain.ui'
**
** Created: Втр Р˜СЋРЅ 23 10:20:35 2009
**      by: The User Interface Compiler ($Id: qt/main.cpp   3.3.8   edited Jan 11 14:47 $)
**
** WARNING! All changes made in this file will be lost!
****************************************************************************/
...
class Form1 : public QMainWindow
{
    Q_OBJECT
    
    MThread *mthread;
public:
    Form1( QWidget* parent = 0, const char* name = 0, WFlags fl = WType_TopLevel );
    ~Form1();


Если ты сделаешь make clean && make distclean && qmake && make, то твои изменения все потеряются. Тебе надо выносить класс в отдельный модуль. Косяк скорее всего в том, что какая-то часть была изменена, а при компиляции эти изменения не видны. Нужно перекомпилить все приложение.

А вообще лучше переходи на Qt 4.

Сообщение отредактировал SABROG - 23.6.2009, 13:33
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
karabura
  опции профиля:
сообщение 23.6.2009, 13:38
Сообщение #18


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 23.6.2009
Пользователь №: 843

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(SABROG @ 23.6.2009, 16:31) *
Файл frmMain.h, видишь что там написано:

/****************************************************************************
** Form interface generated from reading ui file 'frmMain.ui'
**
** Created: Втр Р˜СЋРЅ 23 10:20:35 2009
**      by: The User Interface Compiler ($Id: qt/main.cpp   3.3.8   edited Jan 11 14:47 $)
**
** WARNING! All changes made in this file will be lost!
****************************************************************************/
...
class Form1 : public QMainWindow
{
    Q_OBJECT
    
    MThread *mthread;
public:
    Form1( QWidget* parent = 0, const char* name = 0, WFlags fl = WType_TopLevel );
    ~Form1();


Если ты сделаешь make clean && make distclean && qmake && make, то твои изменения все потеряются. Тебе надо выносить класс в отдельный модуль. Косяк скорее всего в том, что какая-то часть была изменена, а при компиляции эти изменения не видны. Нужно перекомпилить все приложение.

А вообще лучше переходи на Qt 4.

Да, конечно я читал - и именно поэтому не делал qmake. Но я предполагал - что обычный make в этом случае отследит изменения (как это ему и положено).
Спасибо за ответ, я попробую вынести в отдельный модель, ясно - что переходить на 4 придётся в последствии.
Но я не смог в QT Creator - е его средствами создать свою функцию-слот (как в designer) - и это мне не очень понравилось. Хотя скорее всего нужно тщательно изучать матчасть :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_pastor_*
сообщение 23.6.2009, 14:11
Сообщение #19





Гости








    


QThread в Qt3 не является наследником QObject, поэтому и возникает ошибка компиляции при

connect(mthread, SIGNAL( sendWL(char *) ), SLOT( setWL(char *) ) );


(ругается на первый параметр)

Для реализации сигналов слотов в QThread (Qt3) нужно прибегнуть к двойному наследованию

class MThread : public QThread, public QObject
{
    Q_OBJECT
....
};
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 23.6.2009, 14:14
Сообщение #20


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


От оно чё михалыч! Значит я правильно говорю, надо на Qt 4 пересаживаться :rolleyes:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 23.6.2009, 17:18
Сообщение #21


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Цитата(karabura @ 23.6.2009, 11:21) *
Дайте пожалуйста ссылку, как проще это сделать в QT3
В тройке для этих целей используются события: QCustomEvent и QCoreApplication::postEvent

почитать можно здесь:
http://www.prog.org.ru/index.php?topic=809...g43192#msg43192
http://www.prog.org.ru/index.php?topic=891...g50072#msg50072
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 23.6.2009, 20:16
Сообщение #22


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(karabura @ 23.6.2009, 17:14) *
Я не совсем просто понимаю, чем она в контексте простейшей задачи хуже QT4?

Они существенно отличаются.
В общем случае эти две версии несовместимы.
В 4-ке появилось много полезных возможностей.
Большенство людей работают в 4-ке, и могут полноценно подсказать только по ней.
3-ку проблемно скомпилировать под виндовоз, с бесплатными версиям напряг.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
karabura
  опции профиля:
сообщение 24.6.2009, 9:07
Сообщение #23


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 23.6.2009
Пользователь №: 843

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(pastor @ 23.6.2009, 17:11) *
QThread в Qt3 не является наследником QObject, поэтому и возникает ошибка компиляции при

connect(mthread, SIGNAL( sendWL(char *) ), SLOT( setWL(char *) ) );


(ругается на первый параметр)

Для реализации сигналов слотов в QThread (Qt3) нужно прибегнуть к двойному наследованию

class MThread : public QThread, public QObject
{
    Q_OBJECT
....
};

Очень ценно! Спасибо большое!
Вчера пересел за 4, всё заработало. Но всё равно под третьим запущу!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V   1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 23.6.2025, 1:20