Такая ситуация. Есть виджет отрисовки карты, который я переопределил (сделал наследника от 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)));
}
можно создать сигнал в наследуемом виджете , а потом сконнектить его в главном окне с нужным слотом.
или я вопрос не понял?
Сделал вот так вот:
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)));
//
а Q_OBJECT где?
void TLV::measureDistance(bool is_measure)
{
if(!is_measure) return;
emit trackView -> checked_dist_measure(is_measure);//это неверно
editCoords -> setText("Distance measurement");
}
void TLV::measureDistance(bool is_measure)
{
if(!is_measure) return;
emit trackView -> checked_dist_measure(is_measure);//это неверно
editCoords -> setText("Distance measurement");
}
вот еть код
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)));
void TLV::measureDistance(bool is_measure){
if(!is_measure) return;
measureDistance(bool);
editCoords -> setText("Distance measurement");
}
AD, сигнал должен посылать тот класс в котором этот сигнал есть, т.е. checked_dist_measure(bool is_press) из QTrackWidget
void TLV::measureDistance(bool is_measure){
if(!is_measure) return;
measureDistance(bool);
editCoords -> setText("Distance measurement");
}
тогда этот сигнал надо перенести в TLV и тогда сделать так
void TLV::measureDistance(bool is_measure){
if(!is_measure) return;
emit checked_dist_measure(is_measure);
editCoords -> setText("Distance measurement");
}
....
connect(m_tvlWidget, SIGNAL(checked_dist_measure(bool)), this, SLOT(measureDistance(bool)));
....
м... а потом сделать указатель на главное окно программы в том виджете и вызвать указанный слот? Или я опять что-то путаю?
Есть галочка, которую я переключаю в контекстном меню в виджете карты. Необходимо, чтобы при переключении этой галочки, срабатывал слот в другом классе, классе главного окна, в котором содержится данный виджет.
т.е. иерархия классов такая: главный виджет -> карта ?
я понял. "карта" обрабатывает клик в контекстном меню или "главное окно"?
если "карта", то создать сигнал в "карте" и связать его с "главным окном", а уже в "главном окне" создать слот
который будет дергать нужный слот "другого" класса.
Вот скрин:
[attachment=379:dist_galk.JPG]
Задача у меня следующая. При нажатии на "Distance measurement", в поле где отображаются координаты появлялась следующая фраза "Distance measurement". Когда галку убираем, снова были видны координаты. Вот, чего хочу достигнуть!
вы меня не поняли.
Блин, ну не попадает он в этот слот. Как поправить, прям не знаю.
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)
{
if(f) setCursor(Qt::CrossCursor);
else
{
measure_flag = false;
calc_distance -> clear();
}
emit checked_measure(f);
}
/// Инициализация опции для измерения расстояний
void QTrackWidget::initActionMeasurement()
{
//что-то )
connect(measureAction, SIGNAL(toggled(bool)), this, SLOT(check(bool)));
connect(measureAction, SIGNAL(toggled(bool)), this, SLOT(check(bool)));
}
/// Класс главного окна [желательно многие функции вынести из него]
class TLV: public QMainWindow, public TLVClass
{
Q_OBJECT
signals:
void checked_dist_measure(bool is_press);
private slots:
void measureDistance(bool is_measure);
};
/// Слот отображающий в поле вывода координат измеряемое расстояние
void TLV::measureDistance(bool is_measure)
{
emit checked_dist_measure(is_measure);
if(is_measure) editCoords -> setText("Distance measurement");
update();
}
TLV::TLV(QWidget *parent, Qt::WFlags flags)
{
connect(trackView, SIGNAL(checked_dist_measure(bool)), this, SLOT(measureDistance(bool)));
connect(trackView, SIGNAL(checked_dist_measure(bool)), this, SIGNAL(checked_measure(bool)));
}
AD, ты всех запутал своими примерами. Если у тебя есть какие-то отношения, в данном случае сигнально-слотовые.
то ты должен выкидывать из кода, для примеров, только нисущественные моменты, а все существенные оставить. Т.е. участников отношений.
/// Класс виджета карты с траектории
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)));
}
if(f) setCursor(Qt::CrossCursor);
else
{
measure_flag = false;
calc_distance -> clear();
}
который неважен.что в студии компилятор не запускается уже из командной строки?
qmake -project CONFIG+=console
qmake
nmake - ну или как он там??? и всё любуйся на конссоль.
if(f) setCursor(Qt::CrossCursor);
else
{
measure_flag = false;
calc_distance -> clear();
}
или компилябельный пример прикрепи
ЗЫ. в студии есть окно "Output" туда выводится вся дебажная инфа, конечно если приложение собирается в дебажном режиме.
/// Класс виджета карты с траектории
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();
}
судя по коду этого сигнала checked_dist_measure нет в QTrackWidget вот поэтому слот TLV::measureDistance не вызывается.
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)));
}
AD, отредактируй свой пост, чтобы показать в классе TLV объявления всех его слотов и сигналов
TLV::TLV(...)
{
connect(trackView, SIGNAL(checked_measure(bool)), this, SIGNAL(measureDistance(bool)));
}
class TLV ...
{
Q_OBJECT
public:
TLV(...);
signals:
void measureChanged(bool changed);
};
void TLV::measure(bool changed)
{
....
emit measureChanged(changed);
.....
}
Эврика, заработало!
Litkevich Yuriy, kwisp, spirit, спасибо огромное.
P.S. "спасибо" уже поставил, поэтому благодарю так! ))
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)