Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Общие вопросы _ вопрос по сигналам и слотам

Автор: deex 2.9.2009, 18:33

пытаюсь связать интерфейс 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();

как обратиться к созданной кнопке?

Автор: BRE 2.9.2009, 18:39

test obj;
connect( obj.testButton, SIGNAL( clicked() ), recv, SLOT( buttonClicked() ) );
obj.show();


А можно унаследоваться от test:
class Test : public test
{
public:
    Test(...)
    {
        connect( testButton, SIGNAL( clicked() ), SLOT( buttonClicked() ) );
        ...
    }

protected slots:
    void    buttonClicked()
    {
    }
};


В примерах все есть!

Автор: deex 2.9.2009, 18:50

спасибо
в том то и дело что строка, где упоминается test.pushButton - создаёт ошибку

main.cpp:31: error: 'class test' has no member named 'pushButton'

а в случае с классом

main.cpp:11: error: `pushButton' was not declared in this scope

и непонятно что вообще с этим классом дальше делать, просто создать его объект?

Автор: SABROG 2.9.2009, 19:12

Цитата(deex @ 2.9.2009, 19:33) *
допустим создал я на поверхности test.ui кнопку и имя у неё testButton
Цитата(deex @ 2.9.2009, 19:33) *
как обратиться к созданной кнопке?

ui->testButton
или
ui.testButton

в зависимости от того как проектируется приложение.

Автор: deex 3.9.2009, 6:55

получилось.

но ui в классе test был объявлен Эклипсом как приват
сделал его паблик, смог обратиться так:

QObject::connect(test.ui.pushButton, SIGNAL(clicked(int)), &app, SLOT(quit()));

вопрос - почему приват? и правильно ли я делаю, обращаясь так?

Автор: kwisp 3.9.2009, 7:16

deex,
вишь все беды от эклипса.:)
если начинаешь с таких азов начинай в обычном редакторе лишь бы синтаксис подсвечивал.

Автор: deex 3.9.2009, 7:44

кто ж мог подумать что связка Eclipse + QT мешает, а не помогает
обычный С++ я пишу в Эклипсе и мне он очень облегчает жизнь

Автор: reich 3.9.2009, 8:51

Цитата(deex @ 3.9.2009, 7:44) *
кто ж мог подумать что связка Eclipse + QT мешает, а не помогает
обычный С++ я пишу в Эклипсе и мне он очень облегчает жизнь

Бред полнейший. Прочитайте хотябы пол книги по Qt и Вы поймете, как рисовать GUI

Вот простой пример, как этим пользоваться:
//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() ) );
}

Автор: BRE 3.9.2009, 9:30

Цитата(reich @ 3.9.2009, 9:51) *
Бред полнейший. Прочитайте хотябы пол книги по Qt и Вы поймете, как рисовать GUI

:) ;)

Цитата(reich @ 3.9.2009, 9:51) *
Вот простой пример, как этим пользоваться:
//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() ) );
}

Для чего такие сложные телодвижения для получения указателя на QApplication?
Почитай про:
QCoreApplication * QCoreApplication::instance () [static]
и макрос qApp.

Автор: reich 3.9.2009, 11:01

BRE, я привык так делать, потому, что есть иногда другие нужды в использовании QCoreApplication

Автор: BRE 3.9.2009, 11:11

Цитата(reich @ 3.9.2009, 12:01) *
BRE, я привык так делать, потому, что есть иногда другие нужды в использовании QCoreApplication

Интересно, а какие нужды позволяет сделать твой метод передачи по сравнению с ...
QApplication *app = QCoreApplication::instance();
app->....

или просто

qApp->...


Серьезно, не пойму...
Какой смысл передавать и хранить указатель, который можно получить в любом месте?
Причем нужно помнить, что нужно вызвать setInstance().
:blink:

Автор: reich 3.9.2009, 11:14

Цитата(BRE @ 3.9.2009, 11:11) *
Цитата(reich @ 3.9.2009, 12:01) *
BRE, я привык так делать, потому, что есть иногда другие нужды в использовании QCoreApplication

Интересно, а какие нужды позволяет сделать твой метод передачи по сравнению с ...
QApplication *app = QCoreApplication::instance();
app->....

или просто

qApp->...


Серьезно, не пойму...


Пердоставленный выше пример никаких. Было бы короче записать твой вариант. Но я же говорю, что привык писать по другому.

Автор: BRE 3.9.2009, 11:20

Цитата(reich @ 3.9.2009, 12:14) *
Пердоставленный выше пример никаких. Было бы короче записать твой вариант. Но я же говорю, что привык писать по другому.

Любой другой пример....
Для чего может понадобиться сохранять указатель на singleton?
Мы не ищем легких путей? Потенциально тонкий момент, нужно не забывать вызывать setInstance().
Зачем?

Я не прикалываюсь, действительно не понимаю... ;)

Автор: Litkevich Yuriy 3.9.2009, 14:46

Цитата(BRE @ 3.9.2009, 15:20) *
Для чего может понадобиться сохранять указатель на singleton?
эта особенность просто не учтена.
И в Qt поменьшей мере два подобных класса:
QSqlDatabase
QCoreApplication

Автор: BRE 3.9.2009, 15:10

Цитата(Litkevich Yuriy @ 3.9.2009, 15:46) *
эта особенность просто не учтена.

Ты имеешь ввиду - не учтена reich?

Я почему поднял эту тему. По мне, так такой подход в использовании singleton'ов чреват ошибками. Легко обнаруживаемыми и не очень.
Singleton может вовсе не гарантировать, что указатель на объект который вернул метод instance, в дальнейшем будет валиден.
Obj *obj1 = Object::instance();
// Что-то делаем, например вызываем какой нибудь статический Object::reload().
Obj *obj2 = Object::instance();

// Вот здесь obj1 может быть не равен obj2

Поэтому, сохраняя указатель на такой объект, а в дальнейшем его использование чревато тем, что указатель будет указывать на убитый или не валидный объект.
В случае с QCoreApplication это как раз и не вызовет особых проблем, но практика по моему опасна.

Автор: Litkevich Yuriy 3.9.2009, 16:00

Цитата(BRE @ 3.9.2009, 19:10) *
Ты имеешь ввиду - не учтена reich?
угу

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)