crossplatform.ru

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

> Связка слота и сигнала разных объектов
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)));
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Litkevich Yuriy
  опции профиля:
сообщение 15.1.2009, 18:13
Сообщение #2


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

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

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




Репутация:   94  


Цитата(AD @ 15.1.2009, 21:03) *
Этот класс создается сразу при открытии программы.
приведи в пример код.

Цитата(AD @ 15.1.2009, 21:03) *
Тот слот, который ты считаешь не нужным,
читаешь не внимательно:
Цитата(Litkevich Yuriy @ 15.1.2009, 20:56) *
Зато есть мусор:
    if(f) setCursor(Qt::CrossCursor);
    else
    {
        measure_flag = false;
        calc_distance -> clear();
    }


который неважен.
это тело слота
Цитата(AD @ 15.1.2009, 21:03) *
для показа где используется сигнал checked_measure
нет такого места вэтом слоте
Цитата(AD @ 15.1.2009, 21:03) *
для вызова сигнала checked_dist_measure,
тоже нет кода.

предлагаю тебе попорядку заново привести важные части исходников. Тогда будет и понятно и просто привести тебе пример что куда нужно дописать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 15.1.2009, 18:18
Сообщение #3


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

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

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




Репутация:   17  


/// Класс виджета карты с траектории
class QTrackWidget: public QWidget
{
    Q_OBJECT

private:
    QAction* measureAction;            ///< опция для измерения расстояний

private slots:
    void check(bool f);

signals:
    void checked_measure(bool is_press);
};
/// Слот нажатия на опцию измерения расстояния
void QTrackWidget::check(bool f)
{
    ...// anything
    emit checked_measure(f);
}

class Ui_TLVClass
{
public:
    QTrackWidget *trackView;

public:
    void setupUi(QMainWindow *TLVClass);                // setupUi
    void retranslateUi(QMainWindow *TLVClass);            // retranslateUi
};

namespace Ui {
    class TLVClass: public Ui_TLVClass {};
} // namespace Ui

/// Класс главного окна [желательно многие функции вынести из него]
class TLV: public QMainWindow, public TLVClass
{
    Q_OBJECT

signals:
    void checked_dist_measure(bool is_press);

private slots:
    void pressMenu();
    void openRecentFiles();
    void invisibleProgress();
    void pressInnerMenu();
    void measureDistance(bool is_measure);

};

TLV::TLV
{
connect(trackView, SIGNAL(checked_measure(bool)), this,      SIGNAL(checked_dist_measure(bool)));
    connect(trackView, SIGNAL(checked_dist_measure(bool)), this, SLOT(measureDistance(bool)));
}


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


Сообщение отредактировал AD - 15.1.2009, 18:32
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 15.1.2009, 18:28
Сообщение #4


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

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

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




Репутация:   23  


TLV::TLV
{
connect(trackView, SIGNAL(checked_measure(bool)), this,      SIGNAL(checked_dist_measure(bool)));
    connect(trackView, SIGNAL(checked_dist_measure(bool)), this, SLOT(measureDistance(bool)));
}


почему так?
один и тот же сигнал один и тотже объект обработчик один и тот же набор параметров.
почему бы не включить вызов сигнала checked_dist_measure(bool) в слот measureDistance(bool) и соединений на одно станет меньше.:)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- AD   Связка слота и сигнала разных объектов   15.1.2009, 14:18
- - spirit   можно создать сигнал в наследуемом виджете , а пот...   15.1.2009, 14:21
- - Litkevich Yuriy   Цитата(spirit @ 15.1.2009, 17:21) можно с...   15.1.2009, 14:29
|- - AD   Сделал вот так вот: class QTrackWidget: public...   15.1.2009, 14:52
|- - spirit   а Q_OBJECT где?   15.1.2009, 14:55
|- - AD   Цитата(spirit @ 15.1.2009, 14:55) а Q_OBJ...   15.1.2009, 14:58
|- - spirit   void TLV::measureDistance(bool is_meas...   15.1.2009, 15:02
|- - AD   Цитата(spirit @ 15.1.2009, 15:02) void TL...   15.1.2009, 15:04
|- - spirit   вот еть код void TLV::measureDistance...   15.1.2009, 15:09
- - Litkevich Yuriy   AD, сигнал должен посылать тот класс в котором это...   15.1.2009, 15:11
|- - AD   Цитата(Litkevich Yuriy @ 15.1.2009, 15:11...   15.1.2009, 15:30
|- - spirit   тогда этот сигнал надо перенести в TLV и тогда сде...   15.1.2009, 15:35
|- - AD   м... а потом сделать указатель на главное окно про...   15.1.2009, 16:05
|- - kwisp   Цитата(AD @ 15.1.2009, 16:05) м... а пото...   15.1.2009, 16:09
|- - AD   Есть галочка, которую я переключаю в контекстном м...   15.1.2009, 16:31
|- - spirit   т.е. иерархия классов такая: главный виджет -> ...   15.1.2009, 16:34
|- - AD   Цитата(spirit @ 15.1.2009, 16:34) т.е. ие...   15.1.2009, 16:35
|- - spirit   я понял. "карта" обрабатывает клик в кон...   15.1.2009, 16:40
||- - AD   Цитата(spirit @ 15.1.2009, 16:40) я понял...   15.1.2009, 16:44
||- - spirit   вы меня не поняли. ЦитатаКлик обратывается в конт...   15.1.2009, 16:52
|- - AD   Вот скрин: Задача у меня следующая. При нажатии н...   15.1.2009, 16:41
- - Litkevich Yuriy   Цитата(AD @ 15.1.2009, 17:18) Такая ситуа...   15.1.2009, 16:44
|- - kwisp   Цитата(Litkevich Yuriy @ 15.1.2009, 16:44...   15.1.2009, 16:54
|- - AD   Блин, ну не попадает он в этот слот. Как поправить...   15.1.2009, 17:21
- - SABROG   Цитата(AD @ 15.1.2009, 16:44) сигнал...со...   15.1.2009, 16:53
- - Litkevich Yuriy   Цитата(AD @ 15.1.2009, 20:21) в этот слот...   15.1.2009, 17:37
|- - AD   Цитата(Litkevich Yuriy @ 15.1.2009, 17:37...   15.1.2009, 17:42
- - Litkevich Yuriy   Цитата(AD @ 15.1.2009, 20:42) но что надо...   15.1.2009, 17:45
|- - kwisp   Цитата(Litkevich Yuriy @ 15.1.2009, 17:45...   15.1.2009, 17:53
- - Litkevich Yuriy   AD, ты всех запутал своими примерами. Если у тебя ...   15.1.2009, 17:56
|- - AD   Цитата(Litkevich Yuriy @ 15.1.2009, 17:56...   15.1.2009, 18:03
|- - kwisp   что в студии компилятор не запускается уже из кома...   15.1.2009, 18:08
- - Litkevich Yuriy   Цитата(AD @ 15.1.2009, 21:03) Этот класс ...   15.1.2009, 18:13
|- - AD   /// Класс виджета карты с траектории class QTrackW...   15.1.2009, 18:18
|- - spirit   судя по коду этого сигнала checked_dist_measure не...   15.1.2009, 18:28
||- - AD   Цитата(spirit @ 15.1.2009, 18:28) судя по...   15.1.2009, 18:29
||- - spirit   Цитата(AD @ 15.1.2009, 17:29) Цитата(spir...   15.1.2009, 18:38
|- - kwisp   TLV::TLV { connect(trackView, SIGNAL...   15.1.2009, 18:28
- - spirit   или компилябельный пример прикрепи ЗЫ. в студии ...   15.1.2009, 18:18
- - Litkevich Yuriy   AD, отредактируй свой пост, чтобы показать в класс...   15.1.2009, 18:30
- - Litkevich Yuriy   Цитата(kwisp @ 15.1.2009, 21:28) почему т...   15.1.2009, 18:42
- - AD   Эврика, заработало! Litkevich Yuriy, kwisp, ...   15.1.2009, 18:51


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


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




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