crossplatform.ru

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


  Ответ в Связка слота и сигнала разных объектов
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
AD Дата 15.1.2009, 18:51
  Эврика, заработало! :)

Litkevich Yuriy, kwisp, spirit, спасибо огромное.

P.S. "спасибо" уже поставил, поэтому благодарю так! :)))
Litkevich Yuriy Дата 15.1.2009, 18:42
 
Цитата(kwisp @ 15.1.2009, 21:28) *
почему так?
вот после редактирования поста № 35 (! :o: ) стало видно ошибки:
у trackView нет сигнала checked_dist_measure

Цитата(AD @ 15.1.2009, 21:29) *
Вот это откровение для меня, если честно. Если он там нужен, где его там употребить?
нарисуй на бумажке квадратики (классы) и соедени их стралками (сигнал/слот) как они должны общатся, и сразу поймешь, где и что добавить.
spirit Дата 15.1.2009, 18:38
 
Цитата(AD @ 15.1.2009, 17:29) *
Цитата(spirit @ 15.1.2009, 18:28) *
судя по коду этого сигнала checked_dist_measure нет в QTrackWidget вот поэтому слот TLV::measureDistance не вызывается.

Вот это откровение для меня, если честно. Если он там нужен, где его там употребить?


имхо, вот все что нужно


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


а если надо слать сигнал из TLV еще куда-то, то либо в слоте measureDistance делать emit вот так

class TLV ...

{

Q_OBJECT

public:

    TLV(...);

signals:

  void measureChanged(bool changed);

};

void TLV::measure(bool changed)

{

  ....

emit measureChanged(changed);

.....

}
Litkevich Yuriy Дата 15.1.2009, 18:30
  AD, отредактируй свой пост, чтобы показать в классе TLV объявления всех его слотов и сигналов
AD Дата 15.1.2009, 18:29
 
Цитата(spirit @ 15.1.2009, 18:28) *
судя по коду этого сигнала checked_dist_measure нет в QTrackWidget вот поэтому слот TLV::measureDistance не вызывается.

Вот это откровение для меня, если честно. Если он там нужен, где его там употребить?
kwisp Дата 15.1.2009, 18:28
 
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) и соединений на одно станет меньше.:)
spirit Дата 15.1.2009, 18:28
  судя по коду этого сигнала checked_dist_measure нет в QTrackWidget вот поэтому слот TLV::measureDistance не вызывается.
AD Дата 15.1.2009, 18:18
 
/// Класс виджета карты с траектории
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();
}
spirit Дата 15.1.2009, 18:18
  или компилябельный пример прикрепи :)

ЗЫ. в студии есть окно "Output" туда выводится вся дебажная инфа, конечно если приложение собирается в дебажном режиме.
Litkevich Yuriy Дата 15.1.2009, 18:13
 
Цитата(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,
тоже нет кода.

предлагаю тебе попорядку заново привести важные части исходников. Тогда будет и понятно и просто привести тебе пример что куда нужно дописать.
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 9.12.2022, 10:04