Просмотр сообщений
|
Страниц: 1 ... 28 29 [30] 31 32 ... 38
|
437
|
Qt / Многопоточное программирование, процессы / Сигнально-слотовое соединение потоков
|
: Сентябрь 05, 2010, 20:26
|
Есть GUI поток и второй поток MyThread. Нужно обмениваться событиями между потоками. Решил через слоты-сигналы. В главном потоке генерирую сигнал, во втором потоке должен обрабатываться слот. Не получается. Взял готовый пример из "Макс Шлее - QT4.5. Профессиональное программирование на C++." (стр 618-621). Немножко подправил его: добавил кнопку, чтоб контролировать GUI поток. #include <QtGui>
// ====================================================================== class MyThread : public QThread { Q_OBJECT private: int m_nValue;
public: MyThread() : m_nValue(10){}
void run(){exec();}
signals: void finished(); void currentValue(int);
public slots: void slotNextValue() { emit currentValue(--m_nValue);
if (!m_nValue) { emit finished(); } while(1) usleep(100); } };
// ---------------------------------------------------------------------- int main(int argc, char** argv) { QApplication app(argc, argv); QLCDNumber lcd; QPushButton *button = new QPushButton(QString("Button")); MyThread thread;
QTimer timer; QObject::connect(&timer, SIGNAL(timeout()), &thread, SLOT(slotNextValue())); timer.start(1000);
QObject::connect(&thread, SIGNAL(currentValue(int)), &lcd, SLOT(display(int)) ); QObject::connect(&thread, SIGNAL(finished()), &app, SLOT(quit()) );
lcd.setSegmentStyle(QLCDNumber::Filled); lcd.display(10); lcd.resize(220, 90); QWidget widget; QHBoxLayout *layout = new QHBoxLayout; layout->addWidget(&lcd); layout->addWidget(button); widget.setLayout(layout); widget.show(); thread.start(); return app.exec(); }
#include "main.moc" Таймер в основном потоке генерирует сигнал и в потоке MyTread должен быть вызван слот slotNextValue(). Чтоб проверить в каком из потоков вызывается слот решил слот подвесить, добавив строку while(1) usleep(100). Попадая в slotNextValue GUI поток виснет, т.е. получается что слот обрабатывается в главном потоке. Как сделать чтоб сигнал из GUI потока вызывал слот во втором потоке? Пробовал сделать соединенеи QObject::connect(&timer, SIGNAL(timeout()), &thread, SLOT(slotNextValue()), Qt::QueuedConnection); или QObject::connect(&timer, SIGNAL(timeout()), &thread, SLOT(slotNextValue()), Qt::DirectConnection); не помогает. Gui также виснит.
|
|
|
438
|
Qt / Установка, сборка, отладка, тестирование / Re: Ошибка Во время выполнения сборки на этапе 'QMake'
|
: Сентябрь 01, 2010, 05:44
|
нешел в чем была проблемма. Покапался в настройках проекта. В основных настройках была установленна галочка "Фоновая сборка" и был установлен несуществующий каталог. При чем интересно, проект лежит в папке c:/work/MyProj/trunk. Указываю несуществующую папку, например c:/work/MyProj/trunkssss, creator создает папку c:/work/MyProj/trunkssss и делает там сборку. Но если указать несуществующую папку на несущюствующем диске, как у меня было, например d:/work/MyProj/trunk, то тут-то creator загибается и выдает ошибку "Невозможно запустить процесс c:/qt/2010.01/qt/bin/qmake.exe". По мойму это глюк.
|
|
|
439
|
Qt / Установка, сборка, отладка, тестирование / Ошибка Во время выполнения сборки на этапе 'QMake'
|
: Август 31, 2010, 12:45
|
поставил QtCreator (sdk 2010.1). Собираю рабочий проект. Ошибка Выполняется сборка проекта MyProj... Невозможно запустить процесс c:/qt/2010.01/qt/bin/qmake.exe Ошибка во время сборки проекта MyProj Во время выполнения сборки на этапе 'QMake' захожу в рабочую папку, выполняю c:/qt/2010.01/qt/bin/qmake.exe MyProj.pro - работает. В чем может быть проблема? вот настройки qt
|
|
|
440
|
Qt / Пользовательский интерфейс (GUI) / Re: QTreeView
|
: Август 27, 2010, 11:28
|
так что все же... сначала документация... потом поиск... и в последнюю очередь форум.. ибо ни у кого нету желания мусолить одну и ту же проблему то 100 раз.... ну во 1-х ни кто ни кого мусолить не заставляет против желания. лень написать ответ в одно слово - не пиши. А вот длиннющую подколку писать не лень. а во 2-х ну с чего вы взяли что я решаю проблему в обратной последовательности. Почему на человека сразу лепят клеймо - "лень", "не уважение". Естественно сначало проштудировал асистент, потом изучал демки, как троли это делают, потом поиск на форуме, потом поиск в гугле, только потом уже соизволил дерзость побеспокоить участников форума своим вопросом. Кстати, в QTDemo->Item Views->Simple Tree Model не вызывается метод setEditTriggers, однако их QTreeView нередактируемый. Почему?
|
|
|
441
|
Qt / Пользовательский интерфейс (GUI) / Re: QTreeView
|
: Август 27, 2010, 06:19
|
а вот еслиб ты подумал над ключевым вопросом, чтобы сделать из него нормальный заголовок темы, а не просто название виджета. А то я не думал. Сам знаю что заголовок кривой, но лучшего не придумал. Тут же темa "QTreeWidget" и ни каких придирок. Да потом бы догадался получившийся заголовок воткнуть в поиск по форуму. ООО!!! Есть ПОИСК!!! Да Вы что!? Никогда бы не подумал! Ну спасибо, Вы открыли мне глаза! Ну теперь все проблемы в считанные секунды решу.... Форум наверно существует не для того, чтобы получить ответ "Воспользуйся поиском" или "читай асистент". Я даже не знал в QTreeView ли проблема? Может запрет нужно выставлять в моделе, или в атеме. В QDemo есть примеры, в том числе "Simple Tree Model Example", но там такого метода я не заметил. У них почему-то по умолчанию нет редактирования. Абстрактные советы типа "читай доки", "гугли", "подумай сам", "пользуй поиск" - давно уже ни кому ни каких результатов не дают. Вместо вашего бесмысленного длинного ответа с подё....кой можно было ни чего не писать или написать одно слово "setEditTriggers", или правильный, по твоему мнению, заголовок который в поиске сразу найдет ответ. void setEditTriggers ( EditTriggers triggers ) Спасибо, проблема решена.
|
|
|
442
|
Qt / Пользовательский интерфейс (GUI) / QTreeView
|
: Август 26, 2010, 20:51
|
Отобразил дерево в QTreeView. По двойному клику по любой ячейке вызывается редактирование текста в ячейке. Ну могу понять как запретить редактирование?
|
|
|
443
|
Qt / Дополнительные компоненты / Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
|
: Июль 07, 2010, 18:30
|
хотя "См. определение в файле serialdeviceinfo.h строка 35" - нашел, но где-то в конце описания. В асистанте - название класса, файл описания. В справочнике на с++ перед описанием функции или класса - инклуде atoi()
#include <stdlib.h> int atoi(const char *str);
В справочник на СИ - аналогично. А тут как-то всё наоборот, сначало Начало работы с классом необходимо начинать с создания экземпляра объекта SerialDeviceInfo. Пример: ... SerialDeviceInfo *sdi = new SerialDeviceInfo(this); ...
Пробую по примеру создать - не компилируется. нужен инклуде. лазишь по примерам, находишь. Далее делаешь постепенно все по тексту,,,,, описание заканчивается. в самом конце контакты автора и вдруг "См. определение в файле serialdeviceinfo.h строка 35" ))
|
|
|
444
|
Qt / Дополнительные компоненты / Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
|
: Июль 07, 2010, 18:10
|
Отзыв и предложение: Почему бы в документации не написать как эти классы прикрутить к проекту, в каких *.h эти классы описаны? например что-то типа
"В *.pro файл добавте INCLUDEPATH += D:\soft\Qt\serportM\trunk\qserialdevice QMAKE_LIBDIR += D:\Soft\Qt\serportM\trunk\build\lib\qintegratedserialdevice\release LIBS += -lqserialdevice"
А то приходится по примерам лазить. Мелочь - а не приятно. Ну хотя бы какой *.h файл включать нужно - это уж в первую очередь нужно было в доке прописать.
|
|
|
446
|
Qt / Пользовательский интерфейс (GUI) / Re: Как показать текст на ComboBox?
|
: Июль 06, 2010, 04:55
|
Могу предложить следующий вариант, не идеальный, но рабочий.
Ну, тоже коряво как-то, но работает. Спасибо. Только вот текст "Select something..." серенький только когда фокус на ComboBox-e. Ну могу понять почему. Как его заставить серым писать при любом фокусе? ps Странно что такой функции нет в qt. Приходится извращаться. А подобное поведении интерфейса встречается часто. Ну текст-то писать, хотя бы простым шрифтом, при currentItem == -1 ,,,,,, это-то уж были обязаны были сделать еще тролли.
|
|
|
447
|
Qt / Пользовательский интерфейс (GUI) / Как показать текст на ComboBox?
|
: Июль 05, 2010, 20:43
|
Есть ComboBox с некоторыми строками, например "Пушкин", "Есенин". Пока не выбрали ни нужно ни каких поэтов показывать, а нужно показать <Выберите поэта>, бледным цветом шрифта. Как это сделать?
Можно сделать ComboBox с одной строкой "<Выберете поэта>" и показать её бледным шрифтом. А на клик прикрутить слот который удалит строку "<Выберете поэта>" и добавит строки "Пушкин" и "Есенин". Но как то это коряво.
Если не показывать ни одной строки из списка айтемов комбобокса (setCurrentIndex(-1)), то отображается пустая строка. Как в эту пустую строку текст поместить?
|
|
|
450
|
Qt / Общие вопросы / Как можно из floata получить QString?
|
: Июнь 11, 2010, 07:24
|
в теме вопрос. Нужно чтоб строка получилась так
float QString 123456 123456 12345.6 12345 1234.56 1234.6 123.456 123.46 12.3456 12.346 1.23456 1.235 0.12345 0. 123 0.01234 0.012 0.00123 0.001 0.00012 0
Ну в общем как-то так. С помощью sprintf и char* можно добится подобного форматировния. Можно ли подобного добится средствами Qt или std?
|
|
|
|
|