Russian Qt Forum
Ноябрь 02, 2024, 04:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QHash в слоте (нелокальный)  (Прочитано 8643 раз)
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()));//НЕ СОХРАНЯЕТ!!!!!!!!!!!


}
// конец слота

ПОЧЕМУ Непонимающий??!!! Грустный Грустный Грустный Грустный Грустный Грустный Грустный Грустный Грустный Грустный Грустный

 
« Последнее редактирование: Январь 06, 2014, 19:46 от bobka » Записан
Bepec
Гость
« Ответ #1 : Январь 06, 2014, 19:35 »

Честное слово, при взгляде на ваш код у меня мурашки пошли по коже Улыбающийся

1) Что нибудь в хеш у вас добавляется?
2) У вас доходит выполнение кода до вашего добавления в слоте?
Записан
bobka
Гость
« Ответ #2 : Январь 06, 2014, 19:40 »

У меня вообще-то все работает,,,,, я просто показал куски кода, которые необходимы,,,,,,, А что не так???  Написание кода как подчерк, - обычно согласные буквы пропускают, + camel стиль - не знаю  в чем проблема, запятые спереди - так у меня ноутбук маленький, мне так удобно, что бы в конец не лазить и не смотреть - поставил я там запятую или нет,,,
 ВОТ этот бы парень помог, http://www.prog.org.ru/topic_22530_0.html но его нет,,,
« Последнее редактирование: Январь 06, 2014, 19:51 от bobka » Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #3 : Январь 06, 2014, 20:09 »

регистрировать нужно типы, которые передаются как параметры сигналов-слотов. Тебе это не надо. А по проблеме с QHash поможет банальное дебаг с помощью qDebug.
Записан
bobka
Гость
« Ответ #4 : Январь 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 - тоже самое ((((((((((((((((((((((((((
« Последнее редактирование: Январь 06, 2014, 20:27 от bobka » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #5 : Январь 06, 2014, 20:26 »

Покажите как вы проверяете, что ничего не добавляется?
Записан
bobka
Гость
« Ответ #6 : Январь 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() ) не заходит, правильно куда он зайдет если там ничего нет
« Последнее редактирование: Январь 06, 2014, 20:39 от bobka » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #7 : Январь 06, 2014, 20:41 »

Закомментируйте эти строчки:
Код
C++ (Qt)
if(PORT != SenderPort)
      return;
 
Записан
bobka
Гость
« Ответ #8 : Январь 06, 2014, 20:45 »

сделал - выкладываю  картинку,( тоже самое - только qlabel 255.255.255.0 all - и все
« Последнее редактирование: Январь 06, 2014, 20:47 от bobka » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #9 : Январь 06, 2014, 20:49 »

сделал - выкладываю  картинку, простите как вставить изображение? ( тоже самое - только 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()));
 

И скажите, эта информация выводиться?
Записан
bobka
Гость
« Ответ #10 : Январь 06, 2014, 20:49 »

Вот картинка- внизу видно ВСЕ ВЫВОДИТСЯ!!!!!   сборку очищаю - потом делаю qmake потом сборка и запуск - это для чистоты эксперимента, Сделал как Вы просили - ТОТ ЖЕ РЕЗУЛЬТАТ - в консоли выходит - а на qlabel - нет (((((((((((( - короче как на фото только 255,255,255,0 и  all
« Последнее редактирование: Январь 06, 2014, 20:58 от bobka » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #11 : Январь 06, 2014, 21:05 »

А если это окошко отодвинуть в сторону, под ним другого окошка нет?
Записан
bobka
Гость
« Ответ #12 : Январь 06, 2014, 21:08 »

Нет, к сожалению - я это учел,,, передвигал и смотрел по диспетчеру задач - может какой-то поток будет - нет,,,,,,,,,,,,,,,,, нет и все,,, что б ему пусто было!!!, что самое интересное в простой функции делал заполнить - заполнял и выводил, а из слота - нет! прочитал - слот обычная функция,  или что-то не дописывают, или что-то я не понимаю или недопонимаю,,,,,,,,,
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #13 : Январь 06, 2014, 21:10 »

Гадать надоело, выложите архив с приложением, так будет удобней всем. Улыбающийся
Записан
bobka
Гость
« Ответ #14 : Январь 06, 2014, 21:12 »

ВОТ ВЫЛОЖИЛ
« Последнее редактирование: Январь 06, 2014, 21:22 от bobka » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.105 секунд. Запросов: 23.