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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QRadioButton - вызов функции  (Прочитано 5724 раз)
defint
Гость
« : Февраль 19, 2011, 20:36 »

у меня есть функция setLoc(bool) и 2 радиобутона.
как вызвать функцию setLoc(bool) по изменению радиобутона?

думал как-то так:
Код:
QObject::connect(rb1,SIGNAL(toggled(bool)),window,SLOT(setLoc(bool)); 

но непойму что должно быть на месте const char *member.
Записан
Karl-Philipp
Гость
« Ответ #1 : Февраль 19, 2011, 22:00 »

у меня есть функция setLoc(bool) и 2 радиобутона.
как вызвать функцию setLoc(bool) по изменению радиобутона?

думал как-то так:
Код:
QObject::connect(rb1,SIGNAL(toggled(bool)),window,SLOT(setLoc(bool)); 

но непойму что должно быть на месте const char *member.
1) что такое "const char *member"?
2) setLoc(bool) объявлен как функция или как слот?
Записан
defint
Гость
« Ответ #2 : Февраль 20, 2011, 00:06 »

member => 3 аргумент у конекта.
объявлена как функция. если же убрать SLOT() он вообще не будет компилировать.
Записан
Karl-Philipp
Гость
« Ответ #3 : Февраль 20, 2011, 00:34 »

member => 3 аргумент у конекта.
объявлена как функция. если же убрать SLOT() он вообще не будет компилировать.
1) третий аргумент - экземпляр класса, после которого следует слот (объявленный в этом классе) ;
2) срочно объявляй setLoc() в разделе со слотами!
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #4 : Февраль 20, 2011, 01:08 »

Код
C++ (Qt)
QHBoxLayout* hLayout = new QHBoxLayout;
QButtonGroup* bGroup = new QButtonGroup;
 
connect(bGroup, SIGNAL(buttonPressed(int)), SLOT(myslot(int))); //соединяем 1 раз
 
QRadioButton* rButton1 = new QRadioButton;
//rButton1->setLayoutDirection(Qt::RightToLeft);
QRadioButton* rButton2 = new QRadioButton;
//rButton2->setLayoutDirection(Qt::RightToLeft);
 
hLayout->addWidget(this->rButton1);
hLayout->addWidget(this->rButton2);
 
bGroup->addButton(rButton1, 0); //id для первого radiobutton'а
bGroup->addButton(rButton2, 1); //id для второго
 
mybasewidget->setLayout(hLayout);
 
/* где-то в другом месте с разделением декларации/инициализации */
private slots:
void myslot(int _id)
{
if (_id == 0) //выбран 1й radiobutton
{
 
}
//else if...
 
}
 
 
« Последнее редактирование: Февраль 20, 2011, 01:31 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
defint
Гость
« Ответ #5 : Февраль 20, 2011, 14:30 »

всё равно не пойму где объявлять приват слот. создать для него свой класс? до этого у меня нет объявленых классов.

вот как я делаю:
Код
C++ (Qt)
 
class MyClass
{
   Q_OBJECT
private slots:
   void myslot(int _id)
{
...
}
};
 
void menu()
{
   QWidget *window = new QWidget;
 
   QHBoxLayout* hLayout = new QHBoxLayout;
   QButtonGroup* bGroup = new QButtonGroup;
 
   bGroup->connect(bGroup, SIGNAL(buttonPressed(int)), SLOT(myslot(int)));
 
   QRadioButton* rButton1 = new QRadioButton;
   QRadioButton* rButton2 = new QRadioButton;
 
   hLayout->addWidget(rButton1);
   hLayout->addWidget(rButton2);
 
   bGroup->addButton(rButton1, 0);
   bGroup->addButton(rButton2, 1);
 
   window->setLayout(hLayout);
   window->show();
}
 
 
int main(int argc, char *argv[])
{
   QApplication app(argc, argv);
 
   menu();
 
   return app.exec();
}
 
 
« Последнее редактирование: Февраль 20, 2011, 14:32 от defint » Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #6 : Февраль 20, 2011, 17:36 »

Интерфейс от прочего обычно отделяется. Сделай свой MyClass наследником от QWidget. Создай дополнительный gui-класс, с названием, например, Ui_MyClass, в который ты передашь указатель на сам MyClass. Чтоб Ui_MyClass автоматически почистился при удалении MyClass унаследуй его от QObject (если не хочешь чистить ui в деструкторе MyClass'a). Слот необязательно должен быть в секции private, это по обстоятельствам. Макрос Q_OBJECT в каждом своём классе объявлять тоже необязательно, но в любом случае нужен, когда в классе используются сигнал-слот связи, tr() и т.п. Примерный код (не проверял, но идея должна быть ясна):

MyClass.h
Код
C++ (Qt)
#include <QWidget>
 
class Ui_MyClass;
 
class MyClass: public QWidget
{
Q_OBJECT
 
public:
 MyClass(QWidget* parent = 0);
 
private:
 Ui_MyClass* ui;
 
private slots:
 void myslot(int _id);
};
 

MyClass.cpp
Код
C++ (Qt)
#include "MyClass.h"
#include "Ui_MyClass.h"
 
MyClass::MyClass(QWidget* parent = 0): QWidget(parent),
                                      ui(new Ui_MyClass(this))
{
this->ui->setupUi(this);
connect(this->ui->bGroup, SIGNAL(buttonPressed(int)), SLOT(myslot(int)));
}
 
void MyClass::myslot(int _id)
{
//...
}
 


Ui_MyClass.h (гуй на .h/.cpp обычно не разделяется):
Код
C++ (Qt)
#include <QHBoxLayout>
#include <QButtonGroup>
#include <QRadioButton>
#include "MyClass.h"
 
class Ui_MyClass: public QObject
{
Q_OBJECT
 
MyClass* dialog;
 
public:
Ui_MyClass(QObject* parent = 0): QObject(parent),
                                 dialog(0) { }
QHBoxLayout* hLayout;
QButtonGroup* bGroup;
QRadioButton *rButton1,
             *rButton2;
void setupUi(MyClass* _dialog)
{
 this->dialog = _dialog;
 this->hLayout = new QHBoxLayout;
 this->bGroup = new QButtonGroup(this);
 this->rButton1 = new QRadioButton;
 this->rButton2 = new QRadioButton;
 this->hLayout->addWidget(this->rButton1);
 this->hLayout->addWidget(this->rButton2);
 this->bGroup->addButton(this->rButton1, 0);
 this->bGroup->addButton(this->rButton2, 1);
 this->dialog->setLayout(this->hLayout);
}
};
 

main.cpp
Код
C++ (Qt)
#include "MyClass.h"
 
int main(int argc, char *argv[])
{
 QApplication app(argc, argv);
 
 MyClass myObj;
 myObj.show();
 
 return app.exec();
}
 

Конечно можно ещё отметить, что главный класс, в твоём случае это MyClass, желательно организовывать как singleton, но до этого ещё успеешь дойти.
И ещё правильно понимай когда надо передавать в виджет парента, а когда не надо. Если виджет создан в куче (через new), и при этом ему передан parent, то это гарантия его зачистки при удалении parent'a. Это относится только к Qt (у них своеобразная реализация garbage collector'a за счёт фиксирования каждого потомка в QObjectList'e предка), в самописных классах на каждый new приходился бы свой delete. В данном случае для лайаута родителя передавать не надо, т.к. он ему будет назначен методом setLayout. Поскольку другие виджеты получили родителя методом addWidget() лайаута, то при их создании указывать парента не обязательно, а вот для QButtonGroup - надо.
« Последнее редактирование: Февраль 21, 2011, 01:26 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
defint
Гость
« Ответ #7 : Февраль 20, 2011, 18:46 »

хм. а ещё говорят что МФЦ тяжелее.
спасибо за ответ, пойду разбираться. хоть из написанного понял только половину.
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #8 : Февраль 20, 2011, 18:57 »

Это с первого взгляда так кажется, на самом деле ничего сложного, особенно касаемо гуя. Создавай виджеты на стеке (без new) - как члены класса - может быть так легче будет.
« Последнее редактирование: Февраль 20, 2011, 19:35 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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