Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: dr_Begemot от Апрель 08, 2009, 15:13



Название: Как связать три QRadioButton с данными
Отправлено: dr_Begemot от Апрель 08, 2009, 15:13
Есть три QRadioButton - rb1, rb2 rb3? и некоторая переменная int val.
В классе есть слот setVal(int) и сигнал valChanged(int).
Как сделать связь так, чтобы в зависимости от того, какая QRadioButton выбрана переменная меняла свое значение от 0 до 2?

Спасибо)


Название: Re: Как связать три QRadioButton с данными
Отправлено: spirit от Апрель 08, 2009, 15:22
см. QSignalMapper.


Название: Re: Как связать три QRadioButton с данными
Отправлено: pastor от Апрель 08, 2009, 15:32
Есть три QRadioButton - rb1, rb2 rb3? и некоторая переменная int val.
В классе есть слот setVal(int) и сигнал valChanged(int).
Как сделать связь так, чтобы в зависимости от того, какая QRadioButton выбрана переменная меняла свое значение от 0 до 2?

Спасибо)

Есть QButtonGroup. Объедени QRadioButtons в группу и сипользуй сигнал QButtonGroup::buttonClicked(int id)


Название: Re: Как связать три QRadioButton с данными
Отправлено: Racheengel от Апрель 08, 2009, 16:33
+1


Название: Re: Как связать три QRadioButton с данными
Отправлено: dr_Begemot от Апрель 10, 2009, 10:21
Возникли некоторые вопросы...

В классе, порожденном от некоторого виджета делаю следующие коннекты:
Код:
PropertyAxisView::PropertyAxisView(QWidget *parent) : QDialog(parent)
{
  setupUi(this);

  //...

  QSignalMapper *tickLabelSignalMapper = new QSignalMapper(this);
  connect(tickLabelSignalMapper, SIGNAL(mapped(int)), this, SIGNAL(tickLabelChanged(int)));

  tickLabelSignalMapper->setMapping(rdBtnTickLabelAuto, Label_Auto);
  connect(rdBtnTickLabelAuto, SIGNAL(toggled(bool)), tickLabelSignalMapper, SLOT(map()));
  tickLabelSignalMapper->setMapping(rdBtnTickLabelManual, Label_Manual);
  connect(rdBtnTickLabelManual, SIGNAL(toggled(bool)), tickLabelSignalMapper, SLOT(map()));
}


Дальше другой класс PropertyAxis получает указатель на экземпляр PropertyAxisView и пытается приконектится к его сигналу tickLabelChanged. Надо заметить, что сигнал tickLabelChanged есть в обеих классах, но не думаю что это имеет какое-то значение т.к. я пробовал изменить название функции в одном из классов и все равно приведенный ниже коннект не работал.

Код:
void PropertyAxis::ConnectView(){
  bool result;
  result = connect(view(), SIGNAL(tickLabelChanged(int)), this, SLOT(setTickLabel(int)));
}

Функция view() класса PropertyAxis возвращает указатель на заданный экземпляр PropertyAxisView.

Проблема в том, что данный коннект не срабатывает и значение result = false.


Название: Re: Как связать три QRadioButton с данными
Отправлено: pastor от Апрель 10, 2009, 10:39
Покажи *.h файлы


Название: Re: Как связать три QRadioButton с данными
Отправлено: dr_Begemot от Апрель 10, 2009, 12:01
Покажи *.h файлы

PropertyAxisView.h:
Код:
#ifndef PROPERTYAXISVIEW_H
#define PROPERTYAXISVIEW_H

#include <QDialog>
#include <QButtonGroup>
#include "ui_PropertyAxisView.h"
#include "Enums.h"

class PropertyAxisView : public QDialog, public Ui::PropertyAxisView
{
Q_OBJECT
Q_ENUMS(TickLocations TickLabel)
public:
PropertyAxisView(QWidget *parent = 0);

public slots:
signals:
void tickLabelChanged(int);
};

#endif

PropertyAxis.h:
Код:
#ifndef PROPERTYAXIS_H
#define PROPERTYAXIS_H

#include <QDialog>
#include <qnamespace.h>
#include <QObject>
#include "PropertyAxisView.h"

class PropertyAxis : public QObject
{
Q_OBJECT
Q_ENUMS(Place ScaleFormat NumberFormat TickLocations TickLabel)
Q_PROPERTY(PropertyAxisView* view READ view WRITE setView)
        //...
        //...
Q_PROPERTY(TickLabel tickLabel READ tickLabel WRITE setTickLabel)

public:
PropertyAxis();

private:
void ConnectView();
void DisconnectView();

public:
PropertyAxisView* view() const;
        //...
        //...
TickLabel tickLabel() const;

public slots:
void setView(PropertyAxisView* pView);
        //...
        //...
void setTickLabel(TickLabel tickType);

signals:
void viewChanged(PropertyAxisView* pView);
        //...
        //...
void tickLabelChanged(TickLabel tickType);

private:
PropertyAxisView* m_pView;
        //...
        //...
TickLabel m_tickLabel;
};

#endif


Название: Re: Как связать три QRadioButton с данными
Отправлено: pastor от Апрель 10, 2009, 12:06
У тебя setTickLabel принимает тип TickLabel, а в коннекте учавствует int. Посмотри на консоль\out put что там пишется при попытке коннекта?

Кстате, с QButtonGroup код бы получился проще


Название: Re: Как связать три QRadioButton с данными
Отправлено: dr_Begemot от Апрель 10, 2009, 12:16
У тебя setTickLabel принимает тип TickLabel, а в коннекте учавствует int. Посмотри на консоль\out put что там пишется при попытке коннекта?

Кстате, с QButtonGroup код бы получился проще

Действительно...
Уже начал с помощью QButtonGroup реализовывать, но там получается та же проблема...
При попытке сконектиться

connect(view()->bGTickLocations, SIGNAL(buttonClicked(int)), this, SLOT(setTickLocations(TickLocations)));

где bGTickLocations это QButtonGroup, выводится сообщение:"QObject::connect: Incompatible sender/receiver arguments"

Думаю надо сделать 2й setTickLocations(int):
Код:
setTickLocations(int val){
  setTickLocations( (TickLocations)val );
}

Как думаешь? Или есть выход поэлегантней?


Название: Re: Как связать три QRadioButton с данными
Отправлено: pastor от Апрель 10, 2009, 12:42
Как думаешь? Или есть выход поэлегантней?

можно сделать вот такой вот слот:

Код
C++ (Qt)
setTickLocations(int val){
 TickLocations value = static_cast<TickLocations>(val);
  //do something with value
}

Коннект тогда будет выглядеть так:

Код
C++ (Qt)
connect(view()->bGTickLocations, SIGNAL(buttonClicked(int)), this, SLOT(setTickLocations(int)));

ЗЫ: А это что такое: view()->bGTickLocations? Я так понимаю bGTickLocations это QButtonGroup?
Сделай нетак: оставь сингал void tickLabelChanged(int); в PropertyAxisView, сделай коннект:

Код
C++ (Qt)
connect(bGTickLocations, SIGNAL(buttonClicked(int)), this, SIGNAL(tickLabelChanged(int)));

и тогда коннект в PropertyAxis приймент вид:

Код
C++ (Qt)
connect(view(), SIGNAL(tickLabelChanged(int)), this, SLOT(setTickLocations(int)));

имхо


Название: Re: Как связать три QRadioButton с данными
Отправлено: dr_Begemot от Апрель 10, 2009, 13:23
можно сделать вот такой вот слот:
...
имхо
Отличное предложение!
Спасибо, так и сделаю)