crossplatform.ru

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

5 страниц V   1 2 3 > »   
Ответить в данную темуНачать новую тему
> Связка слота и сигнала разных объектов
AD
  опции профиля:
сообщение 15.1.2009, 14:18
Сообщение #1


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

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Такая ситуация. Есть виджет отрисовки карты, который я переопределил (сделал наследника от QWidget). В нем есть слот, который определяется, когда я в контекстном меню нажимаю определенную галочку.
Каким образом мне определить слот в главном окне так, чтобы он реагировал на то же самое действие?


Чтобы не быть голословным, вот небольшой примерчик кода:
/// Класс виджета карты с траектории
class QTrackWidget: public QWidget
{
    Q_OBJECT

private:
    bool measure_flag;                ///< флаг, сигнализирующий о моменте измерения

private:
       void initActionMeasurement();

private slots:
    void check(bool f);

// anything
};

/// Слот нажатия на опцию измерения расстояния
void QTrackWidget::check(bool f)
{
    if(f) setCursor(Qt::CrossCursor);
    else
    {
        measure_flag = false;
        calc_distance -> clear();
    }
}

/// Инициализация опции для измерения расстояний
void QTrackWidget::initActionMeasurement()
{
    // anything
    connect(measureAction, SIGNAL(toggled(bool)), this, SLOT(check(bool)));
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
spirit
  опции профиля:
сообщение 15.1.2009, 14:21
Сообщение #2


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 13.1.2009
Из: Ukraine, Krivoy Rog
Пользователь №: 486

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




Репутация:   1  


можно создать сигнал в наследуемом виджете , а потом сконнектить его в главном окне с нужным слотом.

или я вопрос не понял?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 15.1.2009, 14:29
Сообщение #3


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

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

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




Репутация:   94  


Цитата(spirit @ 15.1.2009, 17:21) *
можно создать сигнал в наследуемом виджете , а потом сконнектить его в главном окне с нужным слотом.

или я вопрос не понял?
полностью аналогично
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 15.1.2009, 14:52
Сообщение #4


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

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Сделал вот так вот:
class QTrackWidget: public QWidget
{

signals:
    void checked_dist_measure(bool is_press);

};


/// Слот отображающий в поле вывода координат измеряемое расстояние
void TLV::measureDistance(bool is_measure)
{
    if(!is_measure) return;
    emit trackView -> checked_dist_measure(is_measure);
    editCoords -> setText("Distance measurement");
}


//
connect(trackView, SIGNAL(checked_dist_measure(bool)), this, SLOT(measureDistance(bool)));
//

Выдает ошибку, что checked_dist_measure - защищенная функция. что я не так сделал? Как тогда следует поступить?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
spirit
  опции профиля:
сообщение 15.1.2009, 14:55
Сообщение #5


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 13.1.2009
Из: Ukraine, Krivoy Rog
Пользователь №: 486

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




Репутация:   1  


а Q_OBJECT где?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 15.1.2009, 14:58
Сообщение #6


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

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Цитата(spirit @ 15.1.2009, 14:55) *
а Q_OBJECT где?

ты про что? Не понял. Есть он и в наследнике от QWidget и в классе главного окна (TLV)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
spirit
  опции профиля:
сообщение 15.1.2009, 15:02
Сообщение #7


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 13.1.2009
Из: Ukraine, Krivoy Rog
Пользователь №: 486

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




Репутация:   1  


void TLV::measureDistance(bool is_measure)
{
    if(!is_measure) return;
    emit trackView -> checked_dist_measure(is_measure);//это неверно
    editCoords -> setText("Distance measurement");
}



нельзя так вызывать сигнал. сделайте обертку в наследуемом классе типа _q_emit_cheched.... и там делаете делайте emit checked_dist_measure(is_measure) или же через QMetaObject::invokeMethod.

но я вот не пойму зачем такой наворот? разве сразу нельзя вызвать, что надо?




Цитата(AD @ 15.1.2009, 13:58) *
Цитата(spirit @ 15.1.2009, 14:55) *
а Q_OBJECT где?

ты про что? Не понял. Есть он и в наследнике от QWidget и в классе главного окна (TLV)


Q_OBJECT нужно вставлять и для наследуемых классов иначе мок не сгенерит нужную инфу и сигналы-слоты работать не будут.


Цитата
The Q_OBJECT macro must appear in the private section of a class definition that declares its own signals and slots or that uses other services provided by Qt's meta-object system.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 15.1.2009, 15:04
Сообщение #8


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

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Цитата(spirit @ 15.1.2009, 15:02) *
void TLV::measureDistance(bool is_measure)
{
    if(!is_measure) return;
    emit trackView -> checked_dist_measure(is_measure);//это неверно
    editCoords -> setText("Distance measurement");
}



нельзя так вызывать сигнал. сделайте обертку в наследуемом классе типа _q_emit_cheched.... и там делаете делайте emit checked_dist_measure(is_measure) или же через QMetaObject::invokeMethod.

но я вот не пойму зачем такой наворот? разве сразу нельзя вызвать, что надо?

Как именно сделать? Можете показать, пожалуйста? Я не совсем понимаю каким образом это сделать? В каком смысле вызвать напрямую? :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
spirit
  опции профиля:
сообщение 15.1.2009, 15:09
Сообщение #9


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 13.1.2009
Из: Ukraine, Krivoy Rog
Пользователь №: 486

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




Репутация:   1  


вот еть код

void TLV::measureDistance(bool is_measure){


    if(!is_measure) return;
    emit trackView -> checked_dist_measure(is_measure);//это неверно
    editCoords -> setText("Distance measurement");
}



в нем вы пытаетесь послать сигнал checked_dist_measure , который находится в другом класс (это уже неверно т.к. все сигналы это protected методы, компиль ругается правильно :) ) и шлете его самому себе, т.е. TLV судя по коннетку


connect(trackView, SIGNAL(checked_dist_measure(bool)), this, SLOT(measureDistance(bool)));


а нельзя ли сделать вот так?

void TLV::measureDistance(bool is_measure){


    if(!is_measure) return;
  measureDistance(bool);  
    editCoords -> setText("Distance measurement");
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 15.1.2009, 15:11
Сообщение #10


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

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

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




Репутация:   94  


AD, сигнал должен посылать тот класс в котором этот сигнал есть, т.е. checked_dist_measure(bool is_press) из QTrackWidget

Цитата(AD @ 15.1.2009, 17:18) *
Чтобы не быть голословным, вот небольшой примерчик кода:
кто такой measureAction в этом примере?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 19.3.2024, 10:21