Russian Qt Forum

Qt => Вопросы новичков => Тема начата: defint от Февраль 19, 2011, 20:36



Название: QRadioButton - вызов функции
Отправлено: defint от Февраль 19, 2011, 20:36
у меня есть функция setLoc(bool) и 2 радиобутона.
как вызвать функцию setLoc(bool) по изменению радиобутона?

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

но непойму что должно быть на месте const char *member.


Название: Re: QRadioButton - вызов функции
Отправлено: Karl-Philipp от Февраль 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) объявлен как функция или как слот?


Название: Re: QRadioButton - вызов функции
Отправлено: defint от Февраль 20, 2011, 00:06
member => 3 аргумент у конекта.
объявлена как функция. если же убрать SLOT() он вообще не будет компилировать.


Название: Re: QRadioButton - вызов функции
Отправлено: Karl-Philipp от Февраль 20, 2011, 00:34
member => 3 аргумент у конекта.
объявлена как функция. если же убрать SLOT() он вообще не будет компилировать.
1) третий аргумент - экземпляр класса, после которого следует слот (объявленный в этом классе) ;
2) срочно объявляй setLoc() в разделе со слотами!


Название: Re: QRadioButton - вызов функции
Отправлено: serg_hd от Февраль 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...
 
}
 
 


Название: Re: QRadioButton - вызов функции
Отправлено: defint от Февраль 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();
}
 
 


Название: Re: QRadioButton - вызов функции
Отправлено: serg_hd от Февраль 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 - надо.


Название: Re: QRadioButton - вызов функции
Отправлено: defint от Февраль 20, 2011, 18:46
хм. а ещё говорят что МФЦ тяжелее.
спасибо за ответ, пойду разбираться. хоть из написанного понял только половину.


Название: Re: QRadioButton - вызов функции
Отправлено: serg_hd от Февраль 20, 2011, 18:57
Это с первого взгляда так кажется, на самом деле ничего сложного, особенно касаемо гуя. Создавай виджеты на стеке (без new) - как члены класса - может быть так легче будет.