Russian Qt Forum

Qt => Вопросы новичков => Тема начата: bobka от Январь 06, 2014, 19:08



Название: 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
Закомментируйте эти строчки:
Код
C++ (Qt)
if(PORT != SenderPort)
      return;
 


Название: 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 - и все

Добавьте сразу перед строкой:
Код
C++ (Qt)
this->IpHostTbl.insert(SenderAddr.toString(), QString(datagram.data()));//НЕ СОХРАНЯЕТ!!!!!!!!!!!

Код
C++ (Qt)
qDebug() << SenderAddr.toString() << QString(datagram.data());
this->IpHostTbl.insert(SenderAddr.toString(), QString(datagram.data()));
 

И скажите, эта информация выводиться?


Название: 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
Вот что в итоге должно получится я добавляю этот модуль к другому модулю - и получится локальная аська,  для общения,  СПАСИБО ВСЕМ, КТО ПОМОГАЛ!!!!!