пытаюсь связать интерфейс Qt с функциями, через сигналы и слоты
вот что на данный момент не получается:
можно создать виджет руками
QLCDNumber *plcd = new QLCDNumber;
и потом привязать сигналы с него к слоту другого виджета
QObject::connect(pspb, SIGNAL(valueChanged(int)), plcd, SLOT(display(int)));
--------
с этим всё понятно, мы передаём в connect() указатель на виджет plcd
но в Eclipse можно рисовать интерфейс в редакторе.
И тогда появляется два файла, к примеру test.h, test.ui
допустим создал я на поверхности test.ui кнопку и имя у неё testButton
в коде можно лишь создать объект
test obj;
и показать его
obj.show();
как обратиться к созданной кнопке?
test obj;
connect( obj.testButton, SIGNAL( clicked() ), recv, SLOT( buttonClicked() ) );
obj.show();
class Test : public test
{
public:
Test(...)
{
connect( testButton, SIGNAL( clicked() ), SLOT( buttonClicked() ) );
...
}
protected slots:
void buttonClicked()
{
}
};
спасибо
в том то и дело что строка, где упоминается test.pushButton - создаёт ошибку
main.cpp:31: error: 'class test' has no member named 'pushButton'
а в случае с классом
main.cpp:11: error: `pushButton' was not declared in this scope
и непонятно что вообще с этим классом дальше делать, просто создать его объект?
получилось.
но ui в классе test был объявлен Эклипсом как приват
сделал его паблик, смог обратиться так:
QObject::connect(test.ui.pushButton, SIGNAL(clicked(int)), &app, SLOT(quit()));
вопрос - почему приват? и правильно ли я делаю, обращаясь так?
deex,
вишь все беды от эклипса.
если начинаешь с таких азов начинай в обычном редакторе лишь бы синтаксис подсвечивал.
кто ж мог подумать что связка Eclipse + QT мешает, а не помогает
обычный С++ я пишу в Эклипсе и мне он очень облегчает жизнь
//main.cpp
#include <QtGui/QApplication>
#include "widget.h"
int main( int argc, char *argv[] ){
QApplication app( argc, argv );
Widget wdg;
wdg.setInstance( app.instance() );
wdg.setVisible( true );
return app.exec();
}
//widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include "ui_widget.h"
class QCoreApplication;
class Widget : public QWidget{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
public:
void setInstance( QCoreApplication *__app );
private:
Ui::WidgetClass _ui;
};
#endif // WIDGET_H
//widget.cpp
#include "widget.h"
#include <QtCore/QCoreApplication>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
_ui.setupUi(this);
}
Widget::~Widget()
{
}
void Widget::setInstance(QCoreApplication *__app){
connect( _ui.pushButton, SIGNAL( clicked() ), __app, SLOT( quit() ) );
}
//main.cpp
int main( int argc, char *argv[] ){
...
wdg.setInstance( app.instance() );
...
}
void Widget::setInstance(QCoreApplication *__app){
connect( _ui.pushButton, SIGNAL( clicked() ), __app, SLOT( quit() ) );
}
BRE, я привык так делать, потому, что есть иногда другие нужды в использовании QCoreApplication
QApplication *app = QCoreApplication::instance();
app->....
или просто
qApp->...
QApplication *app = QCoreApplication::instance();
app->....
или просто
qApp->...
Obj *obj1 = Object::instance();
// Что-то делаем, например вызываем какой нибудь статический Object::reload().
Obj *obj2 = Object::instance();
// Вот здесь obj1 может быть не равен obj2
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)