Russian Qt Forum
Ноябрь 27, 2024, 03:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как связать три QRadioButton с данными  (Прочитано 9364 раз)
dr_Begemot
Гость
« : Апрель 08, 2009, 15:13 »

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

Спасибо)
Записан
spirit
Гость
« Ответ #1 : Апрель 08, 2009, 15:22 »

см. QSignalMapper.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #2 : Апрель 08, 2009, 15:32 »

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

Спасибо)

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

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #3 : Апрель 08, 2009, 16:33 »

+1
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
dr_Begemot
Гость
« Ответ #4 : Апрель 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.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #5 : Апрель 10, 2009, 10:39 »

Покажи *.h файлы
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
dr_Begemot
Гость
« Ответ #6 : Апрель 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
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #7 : Апрель 10, 2009, 12:06 »

У тебя setTickLabel принимает тип TickLabel, а в коннекте учавствует int. Посмотри на консоль\out put что там пишется при попытке коннекта?

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

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
dr_Begemot
Гость
« Ответ #8 : Апрель 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 );
}

Как думаешь? Или есть выход поэлегантней?
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #9 : Апрель 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)));

имхо
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
dr_Begemot
Гость
« Ответ #10 : Апрель 10, 2009, 13:23 »

можно сделать вот такой вот слот:
...
имхо
Отличное предложение!
Спасибо, так и сделаю)
« Последнее редактирование: Апрель 10, 2009, 13:25 от dr_Begemot » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.295 секунд. Запросов: 23.