Просмотр сообщений
|
Страниц: 1 ... 25 26 [27] 28 29 ... 38
|
391
|
Qt / Многопоточное программирование, процессы / Re: Как узнать кто излучил сигнал?
|
: Февраль 06, 2011, 18:29
|
QObject::sender()
старая песня о главном))) в общем случае - вы и не должны знать. никак и никогда. про QObject::sender()- как помню, ассистант рассказывает следующее: данный метод противоречит философии сигнал-слотов и работает только внутри одного потока. .... В общем, имхо, ссылка на объект-источник типа QPointer передаваемая с сигналом - это получше будет и поуниверсальнее, хотя и "более тяжелая конструкция". но QPointer::isNull() удобен. Спасибо за разъяснение. В моём случае как раз сигнал из др. потока.
|
|
|
393
|
Qt / Дополнительные компоненты / Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
|
: Январь 31, 2011, 20:19
|
моё преложение не собирается. Собрал serialDevice 0.4.0. В своём .pro прописал INCLUDEPATH += $$(QTPATH)/serportM04/src/qserialdevice \ $$(QTPATH)/serportM04/src/qserialdeviceenumerator
QMAKE_LIBDIR += $$(QTPATH)/serportM04/src/build/release
LIBS += -lqserialdevice QTPATH = d:/soft/Qt/ при компиляции получаю ошибки d:/soft/Qt/serportM04/src/build/release/libqserialdevice.a(serialdeviceenumerator_p_win.o):serialdeviceenumerator_p_win.cpp:(.text+0x89a): undefined reference to `_imp__SetupDiGetDeviceRegistryPropertyW@28'
d:/soft/Qt/serportM04/src/build/release/libqserialdevice.a(serialdeviceenumerator_p_win.o):serialdeviceenumerator_p_win.cpp:(.text+0xfb3): undefined reference to `_imp__SetupDiGetClassDevsW@16'
d:/soft/Qt/serportM04/src/build/release/libqserialdevice.a(serialdeviceenumerator_p_win.o):serialdeviceenumerator_p_win.cpp:(.text+0x100a): undefined reference to `_imp__SetupDiEnumDeviceInfo@12'
d:/soft/Qt/serportM04/src/build/release/libqserialdevice.a(serialdeviceenumerator_p_win.o):serialdeviceenumerator_p_win.cpp:(.text+0x1170): undefined reference to `_imp__SetupDiOpenDevRegKey@24'
d:/soft/Qt/serportM04/src/build/release/libqserialdevice.a(serialdeviceenumerator_p_win.o):serialdeviceenumerator_p_win.cpp:(.text+0x27de): undefined reference to `_imp__SetupDiDestroyDeviceInfoList@4'
collect2: ld returned 1 exit status
mingw32-make[1]: *** [debug/TestProg.exe] Error 1
mingw32-make: *** [debug] Error 2 Как это победить?
|
|
|
394
|
Qt / Дополнительные компоненты / Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
|
: Январь 31, 2011, 09:14
|
Ну и до кучи ещё вопросы 01346 void AbstractSerial::setCharIntervalTimeout(int usecs) 01347 { 01348 Q_D(AbstractSerial); 01349 if (this->isOpen()) 01350 d->serialEngine->setCharReadTimeout(usecs); 01351 else 01352 this->emitStatusString(ESetCharIntervalTimeout); 01353 }
в 0.2 по возвращаемуму булу судил о том, установлен ли таймаут. если ошибка - вываливал юзеру MessageError. Как сейчас это проверяется? В d->serialEngine->setCharReadTimeout() есть сигнал какой-то? смотрю сигналы у AbstractSerial void AbstractSerial::signalStatus ( const QString & status, QDateTime current ) [signal]
Этот сигнал автоматически испускается при изменении статуса AbstractSerial. Изменение статуса может быть вызвано следующими причинами:
•При ошибках конфигурировании устройства. •При его открытии/закрытии. •При ошибках I/O.
Допустим при открытии/закрытии не нужно не чего делать, а вот при ошибках конфигурировании устройства или при ошибках I/O нужно что-то сделать и пользователя сообщением уведомить. Как отличить излучился сигнал из-за ошибки или из-за открытия/закрытия? Парсить QString& status?
|
|
|
395
|
Qt / Дополнительные компоненты / Re: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].
|
: Январь 31, 2011, 08:56
|
Попробуйте и отпишитесь. Отписываюсь. Попробывать так и не удалось. Я использовал библиотеку 0.2.0. Там нет 230400. Обновился до 0.4.0. Там в справке не увидел 230400, но в *.h вроде есть. но слишлом уж 0.4 отличается от 0.2. Код не компиляется. Придется код перелопатить. Первый косяк... в 0.2 была функция bool AbstractSerial::setCharIntervalTimeout(int), в 0.4 такой нет, вместо неё есть void AbstractSerial::setCharIntervalTimeout(int). Смотрю хелпник void AbstractSerial::setCharIntervalTimeout ( int usecs = 0 )
Устанавливает время ожидания прихода символа в приемный буфер последовательного устройства.
Аргументы: [in] usecs Желаемое время ожидания прихода символа, в мксек.
Возвращает: False в случае ошибки. См. определение в файле abstractserial.cpp строка 1346
Перекрестные ссылки ESetCharIntervalTimeout.
функция по объявлению возвращаяет void, а в хелпе "Возвращает: False в случае ошибки. Не понятно??? могу конечно её использовать как void, но вдруг это ошибка и в следующем релизе эта функция уже будет bool.
|
|
|
397
|
Qt / Пользовательский интерфейс (GUI) / Re: Как реализовать контекстное меню для виджетов?
|
: Январь 29, 2011, 11:08
|
Из пушки по воробьям... всё намного проще:
не знал про такой метод.... А как "простым" методом сепаратор вставить? QMenu * QLineEdit::createStandardContextMenu () Вот это не понял как применить. Хотелось бы пример. У QLineEdit есть стандартное контекстное меню (Copy, Paste, Cut, ....). Если нужно дополнить это сандартное меню своими пунктами, то в "пушке", в mousePressEvent содаем стандартное меню и добавляем свои пункты ... if( event->button() == Qt::RightButton) { QMenu *menu = createStandardContextMenu(); menu.addAction("ShowMessage"); menu.addAction("About Qt"); menu.addSeparator(); menu.addAction("Exit"); menu.exec(event->globalPos()); }.... возможно и без переопределения mousePressEvent можно добавить к стандартному меню свои пункты.
|
|
|
398
|
Qt / Пользовательский интерфейс (GUI) / Re: Как реализовать контекстное меню для виджетов?
|
: Январь 28, 2011, 17:52
|
как создать контекстное меню для любого из виджетов. Переопределить mousePressEvent #include <QtGui/QApplication> #include <QLineEdit> #include <QMenu> #include <QMouseEvent>
class myLineEdit : public QLineEdit { public: myLineEdit(QWidget *p = 0) :QLineEdit(p) {} virtual void mousePressEvent ( QMouseEvent *event ) { if( event->button() == Qt::RightButton) { QMenu menu(this); menu.addAction("ShowMessage"); menu.addAction("About Qt"); menu.addSeparator(); menu.addAction("Exit"); menu.exec(event->globalPos()); } else QLineEdit::mousePressEvent(event); }
};
int main(int argc, char *argv[]) { QApplication a(argc, argv); QWidget w;
QLineEdit *ln = new myLineEdit(&w);
w.show();
return a.exec();
}
|
|
|
400
|
Qt / Многопоточное программирование, процессы / Как вызывать диалоги из не GUI потока?
|
: Январь 26, 2011, 09:18
|
Есть основной (GUI) поток. Есть другой поток занимающийся обменом по GSM модему. Иногда второму потоку нужно что-то от пользователя, например ввести пинкод. Хотелось бы вызвать статическую функцию какого-нибудь диалога, который вернет пинкод. что-то типа
QString pinCode = PinCodeDialog::getPinCode();
как такое в Qt реализовывается?
ps в билдере есть синхронизация с гуипотоком. можно из не гуи потока вызвать диалог с помощью Synchronize(). На время выполнения диалога не гуи поток останавливается. Synchronize позволяет избежать всякие сбои, которые возможны при обращении к одним данным из разных потоков.
|
|
|
401
|
Qt / Интернационализация, локализация / Как получить указатель на QApplication?
|
: Январь 14, 2011, 07:14
|
класический main int main(int argc, char *argv[]) { QApplication app(argc, argv); MainWindow mainWindow; mainWindow.show(); return app.exec(); } у MainWindow нужно определить метод смены языка. в учебниках примеры что-то типа void MainWindow::switchLanguage(int language) { QTranslator translator; switch(language) { case RUSSIAN: translator.load(":/translator/main_ru.qm"); break; case TURKIC: translator.load(":/translator/main_tu.qm"); break; } qapp->installTranslator(&translator); } Так вот, как из MainWindow достать app? Неужели в конструкторе MainWindow нужно передавать указатель на app?
|
|
|
402
|
Программирование / С/C++ / Re: Как в код внедрить что-то типа xml?
|
: Январь 12, 2011, 13:13
|
уверен. пол проги написал на с++ с использованием stl. Проблему решил. Написал *.h. В нем определил константные масивы и параметрами девайсов. Написал короткий парсер, который из этого h файла создает желаемое дерево объектов.
|
|
|
403
|
Программирование / С/C++ / Как в код внедрить что-то типа xml?
|
: Январь 12, 2011, 07:47
|
Есть задача - создать список, например, из объектов Device. class Device { public: Device(); std::string name; int id; std::list<Device*> deviceList; } Под windows(*nix) пишется одна функция Device* createDevice(...), и пишется какой-нибудь файл, типа xml, с описанием всех девайсов которые должны быть в списке. createDevice парсит этот файл и создает нужный список. если нужно добавить девайс в список или изменить праметр, то просто правится *.xml файл, а код остается неизменный. Теперь стоит таже задача, тока для микроконтроллера у которого есть только память программ и озу. Нет ос и нет файловой системы. Можно конечно в коде жёстко написать создание этого списка, типа std::list<Device*> list; list.push_back(createDevice1()); list.push_back(createDevice2()); list.push_back(createDevice3()); list.push_back(createDevice4()); .... list.push_back(createDevice50());
каждая функция по созданию объекта ( createDevice*() ) будет уникальна. В каждой функции createDevice* будет создаваться свой список deviceList. Вобщем код получится очень грамоздкий. Да и добавлять девайсы в список, править параметры достаточно сложно, придётся править исходный код. Хотелось бы написать, как и в случае для Windows, одну функции по созданию девайсов, и ..... как бы в код внедрить что-то типа xml? Как то можно описать это дерево как-то в *.h файле или еще в каком инклуде и потом для добавления/редактирования списка девайсов просто править этот аш?
|
|
|
404
|
Программирование / С/C++ / Re: параметр конструктора
|
: Январь 10, 2011, 06:34
|
to blood_shadow это не из-за того, тут и так понятно что ф-ции не копируются более того ф-ции существуют еще до создания любых объектов да я вроде про функции не говорил. Может смутила запись из асистанта "Note that type() and tableWidget() are not copied." Ну я её понимаю не буквально, я понимаю что параметр type (его тип int), который получил конструктор, не скопируется. Также table widget that contains the item (тип QTableWidget *) не скопируется. но буду очень вам благодарен если скажете как в отладчике посмотреть что первое вызывается ну так глобально переопределить оператор new и переопределить копирующий конструктор Cell. До кучи переопределить копирующий конструктор QTableWidgetItem. Чтоб с gdb не заморачиваться, можно в переопределённых конструкторах и в переопределённом new выводить что-нибудь в cout. Последовательность сообщений в кансоле и будет последовательностью вызова функций.
|
|
|
405
|
Программирование / С/C++ / Re: параметр конструктора
|
: Январь 09, 2011, 08:38
|
"Философия С++. Введение в стандарт", Брюс Эккель, глава 11, стр. 344 Чтобы создать копирующий конструктор для класса, использующего композицию (а также наследование - глава 14), компилятор рекурсивно вызывает копирующие конструкторы всех объектов класса и базовых классов. Там же, в этой главе, примеры, доказывающие это. В вашем случае blood_shadow , с классом Cell, вывозится коп. конст. для QTableWidgetItem. Смотрим асистент QTableWidgetItem::QTableWidgetItem ( const QTableWidgetItem & other ) Constructs a copy of other. Note that type() and tableWidget() are not copied. Попробуйте проверить. Создайте класс Cell, задайте type и tableWidget. создайте копию и посмотрите у копии type и tableWidget. Если у Cell был поразрядный конструктор, то type и tableWidget должны сохранится.
|
|
|
|
|