crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

fantom
  опции профиля:
сообщение 29.1.2009, 16:39
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 47
Регистрация: 29.1.2009
Пользователь №: 515

Спасибо сказали: 1 раз(а)




Репутация:   1  


Здравствуйте. Есть проблема, которую пока никак не могу решить. Соединяю сигнал со слотом, высылаю сигнал - вызывается слот. Как узнать имя сигнала вызвавшего данный слот. Единственное что пока пришло в голову как то использовать класс QSignalSpy. Но как пока не знаю.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
4 страниц V   1 2 3 > »   
Начать новую тему
Ответов (1 - 33)
kwisp
  опции профиля:
сообщение 29.1.2009, 16:45
Сообщение #2


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Цитата(fantom @ 29.1.2009, 16:39) *
Здравствуйте. Есть проблема, которую пока никак не могу решить. Соединяю сигнал со слотом, высылаю сигнал - вызывается слот. Как узнать имя сигнала вызвавшего данный слот. Единственное что пока пришло в голову как то использовать класс QSignalSpy. Но как пока не знаю.


может проще передавать имя сигнала параметром в самом сигнале???

Сообщение отредактировал kwisp - 29.1.2009, 16:46
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fantom
  опции профиля:
сообщение 29.1.2009, 16:57
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 47
Регистрация: 29.1.2009
Пользователь №: 515

Спасибо сказали: 1 раз(а)




Репутация:   1  


Такой вариант меня не очень устраивает так как мне необходимо идентифицировать стандартные сигналы qt. Например от кнопок и др элементов.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 29.1.2009, 17:23
Сообщение #4


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Посмотри в сторону: void QMetaObject::connectSlotsByName ( QObject * object ) [static]
Кажется это то, что тебе нужно. Кажется. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fantom
  опции профиля:
сообщение 29.1.2009, 18:05
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 47
Регистрация: 29.1.2009
Пользователь №: 515

Спасибо сказали: 1 раз(а)




Репутация:   1  


Посмотрел на описание connectSlotsByName ( QObject * object ) .
Этот метод выполняет связку всех сигналов объекта передаваемого в параметре и его дочерних объектов со слотами имена которых строятся по следующему принципу void on_<widget name>_<signal name>(<signal parameters>);

Вот только не очень ясно как это тут можно применить. Мне бы нужно просто имя сигнала в виде const char* узнать.

Или может я просто чего то не понимаю?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 29.1.2009, 20:14
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(fantom @ 29.1.2009, 19:39) *
Как узнать имя сигнала вызвавшего данный слот.
резонный вопрос: зачем? какова конечная цель?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 29.1.2009, 20:45
Сообщение #7


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Цитата(Litkevich Yuriy @ 29.1.2009, 20:14) *
резонный вопрос: зачем? какова конечная цель?
Цитата(fantom @ 29.1.2009, 16:57) *
мне необходимо идентифицировать стандартные сигналы qt. Например от кнопок и др элементов.
По всей видимости обычная дебажная следилка... :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 29.1.2009, 20:48
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(ViGOur @ 29.1.2009, 23:45) *
дебажная следилка
QSignalSpy

но я не думаю, что в этом причина. Знать сигнал на практике редко нужно, нужен объект пославший сигнал.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 29.1.2009, 21:05
Сообщение #9


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Объект пославший сигнал можно получить QObject::sender.
Но вот и правда как получить имя сигнала? :)

Сообщение отредактировал ViGOur - 29.1.2009, 21:06
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fantom
  опции профиля:
сообщение 30.1.2009, 11:28
Сообщение #10


Студент
*

Группа: Участник
Сообщений: 47
Регистрация: 29.1.2009
Пользователь №: 515

Спасибо сказали: 1 раз(а)




Репутация:   1  


Конечная цель не дебажная следилка. Есть заказ на крупное клиент-серверное приложение в котором тысячи всевозможных элементов на формах в том числе нестандартных. На самом деле пытаемся разработать набор библиотек для создания клиент серверной технологии основанной на концепции MVC. Одно из условий наличие тонкового клиента. Так вот хочется максимально упростить написание клиентской части и так как там не предусматривается никакой логики разработку основной части клиента хочется перенести в qt designer. Суть в том что все необходимые для нас виджеты будут переопределены и будут привязаны своими свойствами к свойствам объектов описание которых находится во внешнем xml файле. Эти объекты динамически подгружаются сервером и во време работы происходит автоматическая синхронизация сервера с клиентом, что позволяет избавится от кучи лишней работы связанной с написанием клиента и предоставить ее дизайнеру. Так вот отправка запросов от клиента будет идти по сигналу от любого виджета на форме. Связка сигналов и необходимых групп свойств для запроса на изменении делается в дизайнере. Все эти сигналы планируется связать с одним слотом который будет выполнять парсинг созданных в дизайнере правок и отправки необходимых запросов серверу. Проблема в том чтобы определить от какого объекта и какой сигнал вызвал этот слот.. Причем проблему хоть как то извращенно но надо решить. Может у кого какие идеи есть?

Кстати если реализация будет успешной реализацию данной технологии выложим под GPL.

Ладно щас буду копать в сторону QSignalSpy.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 30.1.2009, 11:41
Сообщение #11


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


единственное что приходит в гоолову это так как вы собираетесь переопределять виджеты
Цитата
..
необходимые для нас виджеты будут переопределены
...

переопределить и стандартные сигналы
...
connect(this,SIGNAL(clicked()),this,SLOT(sendClicked()));// перенаправление стандартного сигнала
...
void sendClicked() {
emit sgClicked(параметр);//этот сигнал соединить со слотом обработчиком и оп параметру определять что за /////сигнал вызвал слот.
}
...


как я понял необходимо определить не только сигнл но объект который его послал. т.к. если будет несколько объектов одного типа стандартные сигналы у них называются одинаково то параметр в сигнале спасает + если он целого типа то значительно упрощает обработку в слоте приемнике.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 30.1.2009, 13:47
Сообщение #12


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


fantom, Если я правильно понял конечную цель, то предлагаю посмотреть на готовое решение: Vedga
Суть проста. На клиента ставится спецпрограмма Vedga-client, прога пишется одна для сервера, но не чистая Qt там в часности соединение сигналов идет другими функциями. написаное прложение запускается на сервере. А клиенты пользуются им с помощью Vedga-client.

Подробности по указанной ссылке, и ниже там смотри ссылку "Обсудить..."

Дальнейшее обсуждение связанное с Vedga перенес в существующую тему. тык
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 30.1.2009, 15:17
Сообщение #13


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


По всей видимости стандартных путей нет.

Если хаком, то по всей видимости тебе нужно достучаться до класса QObjectPrivate, в нем есть структура Sender:
class Q_CORE_EXPORT QObjectPrivate : public QObjectData
{
    Q_DECLARE_PUBLIC(QObject)
public:
    // ...
    struct Sender
    {
        QObject *sender;
        int signal;
        int ref;
    };

    // object currently activating the object
    Sender *currentSender;
    //...
};
signal - это индекс сигнала, благодаря которому ты сможешь получить имя сигнала с помощью QMetaObject.

Судя по коду указатель на QObjectPrivate хранится в d_ptr
class Q_CORE_EXPORT QObject
{
    // ...
protected:
    QObjectData *d_ptr;
    // ...
};


Если я все правильно понял по сырцам...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fantom
  опции профиля:
сообщение 30.1.2009, 16:06
Сообщение #14


Студент
*

Группа: Участник
Сообщений: 47
Регистрация: 29.1.2009
Пользователь №: 515

Спасибо сказали: 1 раз(а)




Репутация:   1  


ViGOur вы исходники какой версии qt смотрели? У меня 4.3.2 и в классе QObjectPrivate да и вообще нигде нет структуры Sender.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 30.1.2009, 16:08
Сообщение #15


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Блин, забыл что у вас 4.3.2, я смотрел 4.4.0. Сейчас гляну можно ли нахаляву хакнуть в 4.3.2.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fantom
  опции профиля:
сообщение 30.1.2009, 16:17
Сообщение #16


Студент
*

Группа: Участник
Сообщений: 47
Регистрация: 29.1.2009
Пользователь №: 515

Спасибо сказали: 1 раз(а)




Репутация:   1  


да.
в 4.4 должно как то так работать
int signalId = (reinterpret_cast<QObjectPrivate*>(this->d_ptr))->currentSender->signal;
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 30.1.2009, 16:17
Сообщение #17


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


В вашей версии есть такой аргумент как QObjectPrivate::currentSenderSignalIdStart.
Гляньте в qtdir/src/corelib/kernel/qobject.cpp в методе bool QObject::event(QEvent *e) есть такой код:
    case QEvent::MetaCall:
        {
            Q_D(QObject);
            QMetaCallEvent *mce = static_cast<QMetaCallEvent*>(e);
            QObject *previousSender = d->currentSender;
            int previousFrom = d->currentSenderSignalIdStart;
            int previousTo = d->currentSenderSignalIdEnd;
            d->currentSender = const_cast<QObject*>(mce->sender());
            d->currentSenderSignalIdStart = mce->signalIdStart();
            d->currentSenderSignalIdEnd = mce->signalIdEnd();
#if defined(QT_NO_EXCEPTIONS)
            mce->placeMetaCall(this);
#else
            try {
                mce->placeMetaCall(this);
            } catch (...) {
                QReadLocker locker(QObjectPrivate::readWriteLock());
                if (QObjectPrivate::isValidObject(this)) {
                    d->currentSender = previousSender;
                    d->currentSenderSignalIdStart = previousFrom;
                    d->currentSenderSignalIdEnd = previousTo;
                }
                throw;
            }
#endif
            QReadLocker locker(QObjectPrivate::readWriteLock());
            if (QObjectPrivate::isValidObject(this)) {
                d->currentSender = previousSender;
                d->currentSenderSignalIdStart = previousFrom;
                d->currentSenderSignalIdEnd = previousTo;
            }
            break;
        }
А вот какзацепиться за currentSenderSignalIdStart, нужно думать...

Сообщение отредактировал ViGOur - 30.1.2009, 16:19
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fantom
  опции профиля:
сообщение 30.1.2009, 16:42
Сообщение #18


Студент
*

Группа: Участник
Сообщений: 47
Регистрация: 29.1.2009
Пользователь №: 515

Спасибо сказали: 1 раз(а)




Репутация:   1  


Кстати а как получить имя сигнала по индексу? Вроде хак по крайней мере на 4.4.2 прокатил.

Или как получить список всех сигналов объекта?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fantom
  опции профиля:
сообщение 30.1.2009, 17:24
Сообщение #19


Студент
*

Группа: Участник
Сообщений: 47
Регистрация: 29.1.2009
Пользователь №: 515

Спасибо сказали: 1 раз(а)




Репутация:   1  


Ну судя по metaObject()->indexOfSignal обращение через QObjectPrivate работает верно..
Но все же как получить список сигналов как это делает qt designer?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 30.1.2009, 17:24
Сообщение #20


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Цитата(fantom @ 30.1.2009, 16:42) *
Или как получить список всех сигналов объекта?

Примерно так:
    for( int i = 0; i < this->metaObject()->methodCount(); ++i)
    {
        QMetaMethod mm = this->metaObject()->method( i);
        const char *p = mm.signature();
    }
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fantom
  опции профиля:
сообщение 30.1.2009, 17:45
Сообщение #21


Студент
*

Группа: Участник
Сообщений: 47
Регистрация: 29.1.2009
Пользователь №: 515

Спасибо сказали: 1 раз(а)




Репутация:   1  


Точно! Спасибо все работает.
    for( int i = 0; i < this->metaObject()->methodCount(); ++i)
    {
        QMetaMethod mm = this->metaObject()->method( i);
        const char *p = mm.signature();
    if (mm.methodType() == QMetaMethod::Signal)
    qDebug() << p;
    }

И еще вопрос. Индекс сигнала у объекта всегда постоянен в рамках неизменности описания класса?

В итоге что вышло. Чтобы получить имя сигнала вызвавшего слот в Qt 4.4.x можно сделать так.
#include "qobject_p.h"
void Test::testSlot()
{
    QObjectPrivate* sh = reinterpret_cast<QObjectPrivate*>(this->d_ptr);
    int idSignal = sh->currentSender->signal;
    for( int i = 0; i < this->metaObject()->methodCount(); ++i)
    {
        QMetaMethod mm = this->metaObject()->method( i);
        const char *p = mm.signature();
    if (mm.methodType() == QMetaMethod::Signal)
    {
        if (idSignal == metaObject()->indexOfSignal(p)) 
        qDebug() << "Name of Signal" << p;
    }
    }
}

Хотя кончено это не совсем правомерно но работает. Надо тролям писать чтобы реализовали метод получения имени сигнала!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 31.1.2009, 11:30
Сообщение #22


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Цитата(fantom @ 30.1.2009, 17:45) *
В итоге что вышло. Чтобы получить имя сигнала вызвавшего слот в Qt 4.4.x можно сделать так.
Можно упростить:
#include "qobject_p.h"
void Test::testSlot()
{
    QObjectPrivate* sh = reinterpret_cast<QObjectPrivate*>(this->d_ptr);
    int idSignal = sh->currentSender->signal;
    QMetaMethod mm = this->metaObject()->method( idSignal);
    const char *p = mm.signature();
    if (mm.methodType() == QMetaMethod::Signal)
    {
        qDebug() << "Name of Signal" << p;
    }
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 31.1.2009, 11:54
Сообщение #23


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Обсуждение связанное с Vedga перенес в существующую тему. тык
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 31.1.2009, 13:23
Сообщение #24


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Цитата(fantom @ 29.1.2009, 16:57) *
так как мне необходимо идентифицировать стандартные сигналы qt. Например от кнопок и др элементов.


Этот код работает только в пределах одного объекта, который выпускает и ловит сигнал.
Т.е. при нажатии на кнопку мы уже не получим имя сигнала, которое было у QPushButton'а. А d_ptr чужих объектов естественно закрыт.

Кстати без reinterpret_cast тоже работает:

#include "private/qobject_p.h" //у меня только так захотел находить заголовок
...
qint32 idSignal = ((QObjectPrivate*)d_ptr)->currentSender->signal;


Сообщение отредактировал SABROG - 31.1.2009, 13:26
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fantom
  опции профиля:
сообщение 2.2.2009, 17:34
Сообщение #25


Студент
*

Группа: Участник
Сообщений: 47
Регистрация: 29.1.2009
Пользователь №: 515

Спасибо сказали: 1 раз(а)




Репутация:   1  


Цитата(SABROG @ 31.1.2009, 13:23) *
Этот код работает только в пределах одного объекта, который выпускает и ловит сигнал.

Ты прав. Я об этом не подумал. Но это лечится. Достаточно ввести новый класс
class Q_Object: public QObject
{
Q_OBJECT
public:
using QObject::d_ptr;
};


И теперь уже все объекты от которых надо идентифицировать сигналы унаследовать уже от него, а не от QObject
Проверил исправленный код у меня вроде работает.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 2.2.2009, 18:45
Сообщение #26


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


fantom

Цитата(fantom @ 2.2.2009, 17:34) *
Цитата(SABROG @ 31.1.2009, 13:23) *
Этот код работает только в пределах одного объекта, который выпускает и ловит сигнал.

Ты прав. Я об этом не подумал. Но это лечится. Достаточно ввести новый класс
class Q_Object: public QObject
{
Q_OBJECT
public:
using QObject::d_ptr;
};


И теперь уже все объекты от которых надо идентифицировать сигналы унаследовать уже от него, а не от QObject
Проверил исправленный код у меня вроде работает.


Чувствую, что где-нибудь в другом месте косяк потом с этим вылезет. Например с чужими плагинами или библиотеками.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fantom
  опции профиля:
сообщение 2.2.2009, 19:18
Сообщение #27


Студент
*

Группа: Участник
Сообщений: 47
Регистрация: 29.1.2009
Пользователь №: 515

Спасибо сказали: 1 раз(а)




Репутация:   1  


Ну чтобы не вылезло можешь в каждом своем наследнике от QObject писать
public:
using QObject::d_ptr;

Этим мы просто говорим чтобы поле d_ptr стало public. Тогда никаких проблем быть не должно.
Конечно понимаю что все это изврат и костыли, но если очень надо то больше вариантов я не знаю.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 2.2.2009, 20:39
Сообщение #28


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


fantom

Цитата(fantom @ 2.2.2009, 19:18) *
Ну чтобы не вылезло можешь в каждом своем наследнике от QObject писать
public:
using QObject::d_ptr;

Этим мы просто говорим чтобы поле d_ptr стало public. Тогда никаких проблем быть не должно.
Конечно понимаю что все это изврат и костыли, но если очень надо то больше вариантов я не знаю.


Я говорю об объектах, реализация которых скрыта в файлах библиотек. Есть только хедер и .lib/.a файл.
И о проектах в исходники которых тебе не захочется лезть. Например комплексные, встраиваемые виджеты с кучей дочерних элементов. Придется много кода переписать, чтобы их всех "отнаследовать".

Может это можно как-то по-нормальному сделать? Если все коннекты мы сами делаем, то почему-бы не "запитать" пришедший сигнал на наш слот-ретранслятор, например slt_btn_clicked(). Далее emitим' сигнал дальше на обработчик:

emit sig_btn_clicked(sender(), "clicked");


Соотв. все зеркальные сигналы законнектить на один слот.в нас.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fantom
  опции профиля:
сообщение 3.2.2009, 17:01
Сообщение #29


Студент
*

Группа: Участник
Сообщений: 47
Регистрация: 29.1.2009
Пользователь №: 515

Спасибо сказали: 1 раз(а)




Репутация:   1  


SABROG ты сам запутался и меня запутал. короче никаких using и наследований использывать не надо. Вот так все работает.
void Test::testSlot()
{
    QObjectPrivate* sh = reinterpret_cast<QObjectPrivate*>(this->d_ptr);
    int idSignal = sh->currentSender->signal;
        QMetaMethod mm = (sender())->metaObject()->method( idSignal );
        const char *p = mm.signature();
    qDebug() << "Name of Signal" << p;
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 3.2.2009, 18:02
Сообщение #30


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


:) ну теперь, по идее, должно все работать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 4.2.2009, 9:04
Сообщение #31


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


Что-то помоему как-то всё через чур сложно. Может по другому прощее будет?
Например:
1. В дизайнере создаётся интерфейс (UI форма).
2. Для виджетов, сигналы которых нужно транслировать добавляется динамическое свойство с именами сигналов.
3. "Лёгкий клиент" грузит ui-шку (QUiLoader), пробегается по всем её виджетикам, и для тех у кого есть соответственное динамическое свойство создаёт нужные конекты в которых вся нужная инфа и отфудболивается на сервак.

И не нужно никаких хаков Qt.
Кроме того, покуда не изменились имена можно безболезненно менять интерфейс.
Так же клиент полностью не зависит от UI, т.е. его вообще не нужно перекомпилять при добавлении новой формочки. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 4.2.2009, 9:18
Сообщение #32


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


QObject - не обязательно виджет. QTimer например.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 4.2.2009, 9:49
Сообщение #33


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


Цитата(SABROG @ 4.2.2009, 12:18) *
QObject - не обязательно виджет. QTimer например.

Читаем, что же изначально хотел автор:
Цитата(fantom @ 30.1.2009, 14:28) *
...Так вот хочется максимально упростить написание клиентской части и так как там не предусматривается никакой логики разработку основной части клиента хочется перенести в qt designer...

QTimer-а в дизайнере нет.
Он создаётся в коде. Если есть код, то почему в нём же и не связать его со всеми нужными слотами? :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 4.2.2009, 11:39
Сообщение #34


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Мое дело предупредить, а уж кто как захочет ваше дело. Я пытаюсь мыслить глобально.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

4 страниц V   1 2 3 > » 
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 24.5.2025, 15:59