Название: QHash в слоте (нелокальный) Отправлено: bobka от Январь 06, 2014, 19:08 задача: принять пакет по udp и записать в qhash ip-адрес и имя хоста(содержимое пакета, datagrama.data()) Все работает, - пакеты приходят, в слоте через "qDebug() <<" пишутся в консоль с нужными данными (ip и хост-имя), НО ни как не могу записать их в qhash - то есть я делаю присваивание ключа и значения соответствующего типа - пустая строка, просто присваиваю в слоте "адракадабру" соответствующего типа - результат такой же - пустая строка, а вот в любой другой функции - работает все на "ура", то есть сохраняется и ключ и значение! Начал копать "мета-модель", Прошу подтвердить или опровергнуть мои предположения, я понять сперва хочу, а уж потом код покажу.
ВЕРНО ЛИ, ЧТО 1 сигналы и слоты имеют свои типы данных, если тип данных отсутствует(не зарегистрирован) внутри тела сигнала или слота, то его нужно зарегистрировать, qRegisterMetaType 2 если тип данных не зарегистрирован, с ним нельзя делать операции записи и чтения ТОГДА ВОПРОСЫ 1 КАК УЗНАТЬ ДАННЫЙ ТИП ЗАРЕГИСТРИРОВАН ИЛИ НЕТ 2 ПОЧЕМУ НЕЛЬЗЯ ИСПОЛЬЗОВАТЬ виртуальные функции при установки св-ва объекта, так называемые wrappers, обертки, ПРИ Q_PROPERTY - по существу же, это те же функции вставки и чтения Q_PROPERTY(THash IpHostTbl READ item WRITE insert ) Теперь код: //header typedef QHash <QString, QString> THash; Q_DECLARE_METATYPE(THash) class MainWin : public QWidget { Q_OBJECT public : explicit MainWin(QWidget* parent = 0); private slots: void readDatagram(); public : void allSendInfo(); private : QUdpSocket UdpSckt; const QString HostIp; const QString HostName; THash IpHostTbl; }; // end header // реализация MainWin::MainWin(QWidget* parent) : QWidget(parent), UdpSckt(this) ,HostIp(QNetworkInterface::allAddresses().first().toString()) ,HostName(QHostInfo::localHostName()) ,IpHostTbl() { qRegisterMetaType<THash>("THash"); this->IpHostTbl.insert("255.255.255.0", "all"); // для отладки не играет роли - просто проверка this->UdpSckt.bind(QHostAddress::LocalHost, PORT); QObject::connect(&UdpSckt, SIGNAL(readyRead()), this, SLOT(readDatagram()) ); } // конец реализации // сам слот void MainWin::readDatagram() { QHostAddress SenderAddr; quint16 SenderPort; QByteArray datagram; while(this->UdpSckt.hasPendingDatagrams()) { datagram.resize(UdpSckt.pendingDatagramSize()); this->UdpSckt.readDatagram(datagram.data(), datagram.size(), &SenderAddr, &SenderPort); } if(PORT != SenderPort) return; this->IpHostTbl.insert(SenderAddr.toString(), QString(datagram.data()));//НЕ СОХРАНЯЕТ!!!!!!!!!!! } // конец слота ПОЧЕМУ ?????!!! :( :( :( :( :( :( :( :( :( :( :( Название: Re: QHash в слоте (нелокальный) Отправлено: Bepec от Январь 06, 2014, 19:35 Честное слово, при взгляде на ваш код у меня мурашки пошли по коже :)
1) Что нибудь в хеш у вас добавляется? 2) У вас доходит выполнение кода до вашего добавления в слоте? Название: Re: QHash в слоте (нелокальный) Отправлено: bobka от Январь 06, 2014, 19:40 У меня вообще-то все работает,,,,, я просто показал куски кода, которые необходимы,,,,,,, А что не так??? Написание кода как подчерк, - обычно согласные буквы пропускают, + camel стиль - не знаю в чем проблема, запятые спереди - так у меня ноутбук маленький, мне так удобно, что бы в конец не лазить и не смотреть - поставил я там запятую или нет,,,
ВОТ этот бы парень помог, http://www.prog.org.ru/topic_22530_0.html но его нет,,, Название: Re: QHash в слоте (нелокальный) Отправлено: Alex Custov от Январь 06, 2014, 20:09 регистрировать нужно типы, которые передаются как параметры сигналов-слотов. Тебе это не надо. А по проблеме с QHash поможет банальное дебаг с помощью qDebug.
Название: Re: QHash в слоте (нелокальный) Отправлено: bobka от Январь 06, 2014, 20:17 У меня сборка static с флагами configure.exe -static -release -opensource -confirm-license -platform win32-g++ -no-exceptions -no-rtti -no-stl -no-qt3support
QMAKE_CFLAGS_RELEASE = -g0 -ggdb0 -gstabs0 -mtune=native -O3 -fomit-frame-pointer -static ( НА РАБОТЕ ТОЛЬКО ОБЫЧНАЯ СБОРКА(debug-release без оптимизации) - НО ЕЩЕ 3 ДНЯ ДО РАБОТЫ) НАСЧЕТ ПАРАМЕТРОВ ПОНЯЛ!!!!!!!!!! ХОТЬ ЧТО-ТО УЖЕ, qDebug - пробывал, как ни странно - пишет все данные, до слез обидно и формат(тип) такой же,,,,,,,,, - что ей пусто было, но в хэш - ни пишет паразит!!!! я уж и статический хэш пробывал и регистрировал - короче обычная комбинаторика - результат полный НОЛЬ(или НУЛЬ, одно число, другое значение его),,,,,,,, перебрал все комбинации, можно выкрутится - через QString вылезти глобальный, но зачем, пробывал и через QVariant - тоже самое (((((((((((((((((((((((((( Название: Re: QHash в слоте (нелокальный) Отправлено: Old от Январь 06, 2014, 20:26 Покажите как вы проверяете, что ничего не добавляется?
Название: Re: QHash в слоте (нелокальный) Отправлено: bobka от Январь 06, 2014, 20:30 void MainWin::showTable()
{ QHashIterator<QString, QString> iter(this->IpHostTbl); while(iter.hasNext() ) { QLabel* Label = new QLabel(); iter.next(); Label->setText(iter.key() + " " + iter.value()); Label->show(); } } выход только первая строка - 255,255,255,0 и all(то что в конструкторе занес -он ее и выводит) - я ее выключал - должно быть 127.0.0.1 и computer - фик там - он while(iter.hasNext() ) не заходит, правильно куда он зайдет если там ничего нет Название: Re: QHash в слоте (нелокальный) Отправлено: Old от Январь 06, 2014, 20:41 Закомментируйте эти строчки:
Код
Название: Re: QHash в слоте (нелокальный) Отправлено: bobka от Январь 06, 2014, 20:45 сделал - выкладываю картинку,( тоже самое - только qlabel 255.255.255.0 all - и все
Название: Re: QHash в слоте (нелокальный) Отправлено: Old от Январь 06, 2014, 20:49 сделал - выкладываю картинку, простите как вставить изображение? (http://)( тоже самое - только qlabel 255.255.255.0 all - и все Добавьте сразу перед строкой: Код
Код
И скажите, эта информация выводиться? Название: Re: QHash в слоте (нелокальный) Отправлено: bobka от Январь 06, 2014, 20:49 Вот картинка- внизу видно ВСЕ ВЫВОДИТСЯ!!!!! сборку очищаю - потом делаю qmake потом сборка и запуск - это для чистоты эксперимента, Сделал как Вы просили - ТОТ ЖЕ РЕЗУЛЬТАТ - в консоли выходит - а на qlabel - нет (((((((((((( - короче как на фото только 255,255,255,0 и all
Название: Re: QHash в слоте (нелокальный) Отправлено: Old от Январь 06, 2014, 21:05 А если это окошко отодвинуть в сторону, под ним другого окошка нет?
Название: Re: QHash в слоте (нелокальный) Отправлено: bobka от Январь 06, 2014, 21:08 Нет, к сожалению - я это учел,,, передвигал и смотрел по диспетчеру задач - может какой-то поток будет - нет,,,,,,,,,,,,,,,,, нет и все,,, что б ему пусто было!!!, что самое интересное в простой функции делал заполнить - заполнял и выводил, а из слота - нет! прочитал - слот обычная функция, или что-то не дописывают, или что-то я не понимаю или недопонимаю,,,,,,,,,
Название: Re: QHash в слоте (нелокальный) Отправлено: Old от Январь 06, 2014, 21:10 Гадать надоело, выложите архив с приложением, так будет удобней всем. :)
Название: Re: QHash в слоте (нелокальный) Отправлено: bobka от Январь 06, 2014, 21:12 ВОТ ВЫЛОЖИЛ
Название: Re: QHash в слоте (нелокальный) Отправлено: Old от Январь 06, 2014, 21:19 Добавьте любое нужное расширение, хоть .png. :)
Название: Re: QHash в слоте (нелокальный) Отправлено: bobka от Январь 06, 2014, 21:25 я выложил - все исходники - можно собрать проект, буду ждать решения
Название: Re: QHash в слоте (нелокальный) Отправлено: Old от Январь 06, 2014, 22:03 я выложил - все исходники - можно собрать проект, буду ждать решения Так вы выводите состояние хеша, еще до начала работы самой программы.Конечно в нем только то, что вы добавляете в него в конструкторе. Название: Re: QHash в слоте (нелокальный) Отправлено: bobka от Январь 06, 2014, 22:04 а как же данные из слота?????? данные из слота же не передаются - они не пишутся туда
Название: Re: QHash в слоте (нелокальный) Отправлено: VPS от Январь 06, 2014, 22:05 сделайте метод "ShowTable" слотом и вызывайте его по окончанию слота "readDatagram". Тогда всё увидите...
Название: Re: QHash в слоте (нелокальный) Отправлено: bobka от Январь 06, 2014, 22:06 :-) это тот о ком я говорил, а можно пояснить - что бы я понял???? мне бы хотелось логику понять
Название: Re: QHash в слоте (нелокальный) Отправлено: Old от Январь 06, 2014, 22:10 а как же данные из слота?????? данные из слота же не передаются - они не пишутся туда Все они пишутся, вы выводите результат еще до отработки слота чтения датаграммы. :)Название: Re: QHash в слоте (нелокальный) Отправлено: bobka от Январь 06, 2014, 22:13 то есть - сперва присваиваю, а потом объявляю переменную?????? - на рушение порядка прохождения???? Хорошо, попробую завтра, главное мысль понял - СПАСИБО!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Название: Re: QHash в слоте (нелокальный) Отправлено: Old от Январь 06, 2014, 22:18 то есть - сперва присваиваю, а потом объявляю переменную?????? - на рушение порядка прохождения???? Нет. Прием датаграмм, а следовательно и добавление в хеш, начнется только после запуска цикла обработки событий.Это происходит в функции main, при вызове App.exec(). Вы же еще до самого запуска этого цикла выполняете: Win.ShowTable() В этот момент в хеше еще ничего нет, ни одной датаграммы еще не получено. Название: Re: QHash в слоте (нелокальный) Отправлено: bobka от Январь 06, 2014, 22:21 ВРУБИЛСЯ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ;D ;D ;D ;D ;D ;D ;D
[/quote] СПАСИБО БОЛЬШОЕ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ДОПИШУ ЗАВТРА У МЕНЯ УЖЕ ГЛУБОКАЯ НОЧЬ,,, - Я ПОШЕЛ В ОБЪЯТИЯ МОРФЕЯ! Название: Re: QHash в слоте (нелокальный) Отправлено: bobka от Январь 07, 2014, 11:35 все работает, - не стал заморачиваться со слотами - сделал по таймеру, к тому же все равно он в данном модуле нужен для обновления таблицы хостов.
Название: Re: QHash в слоте (нелокальный) Отправлено: bobka от Январь 07, 2014, 11:44 Вот что в итоге должно получится я добавляю этот модуль к другому модулю - и получится локальная аська, для общения, СПАСИБО ВСЕМ, КТО ПОМОГАЛ!!!!!
|