Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Работа из сигналами Qt


Автор: Enchance 16.2.2011, 18:11
Добрый день!
Начинаю изучать Qt. Уже несколько дней сижу, читаю Макса Шлее, и все равно не могу понять, что к чему. Возможно, это из-за того, что я только в общих чертах знаком с ООП (с++ знаю только из двух семестров обучения в университете). Помогите с простейшей программой, чтобы я смог хоть от чего-то оттолкнуться.
Нужно сделать приложение, в котором будут две pushButton кнопки и одна область QGraphicsViev. При нажатии на одну кнопку в области QGraphicsViev выводится первая картинка, а при нажатии на вторую - вторая. Как накидать кнопок на окно я понял, а вот как заставить кнопки выполнять что-то осмысленное - нет. Я так понимаю, здесь нужно использовать сигналы и слоты, но как это делать, как присобачить сигналы к кнопкам?
Буду признателен, если дадите почитать описание, где это описано попроще.

Автор: Веталька 16.2.2011, 20:42
connect(YouButton,SIGNAL(clicked()),this,SLOT(showpicture()));
ну и showpicture не забудь описать (publick slots)

Автор: kefir01 16.2.2011, 20:44
нажми правой кнопкой мыши на кнопке -> Перейти к слоту...

или в конструкторе родительского виджета (или где угодно) - функцией connect, описанной подробно в справке

Автор: Enchance 17.2.2011, 02:58
Нашел пример из той же книги, описывающий принцип работы сигналов. Программа состоит из файлов "main.cpp", "counter.cpp", "counter.h", есть одно окно с цифрой, и второе с кнопкой "ADD". Понял суть работы сигналов, но не знаю, как изменить эту программу под мои нужды. Для начала обьясните хоть, как сделать, чтобы цифра и кнопка находились в одном окне? И как вставить область, в которой будут меняющиеся картинки?

Документация только на инглише, а значит трудночитабельна для меня, к сожалению(

main.cpp
Код

#include <QtGui>
#include "Counter.h"

// ----------------------------------------------------------------------
int main (int argc, char** argv)
{
    QApplication app(argc, argv);

    QLabel      lbl("0");
    QPushButton cmd("ADD");
    Counter     counter;

    lbl.show();
    cmd.show();

    QObject::connect(&cmd, SIGNAL(clicked()), 
                     &counter, SLOT(slotInc())
                    );

    QObject::connect(&counter, SIGNAL(counterChanged(int)),
                     &lbl, SLOT(setNum(int))
                    );

    QObject::connect(&counter, SIGNAL(goodbye()), 
                     &app, SLOT(quit())
                    );

    return app.exec();
}


counter.h
Код

#ifndef _Counter_h_
#define _Counter_h_

#include <QObject>

// ======================
class Counter : public QObject {
    Q_OBJECT
private:
    int m_nValue;

public:
    Counter();

public slots:
    void slotInc();

signals:
    void goodbye       (   );
    void counterChanged(int);
};
#endif  //_Counter_h_


counter.cpp
Код

#include "Counter.h"

// ----------------------------------------------------------------------
Counter::Counter() : QObject()
                   , m_nValue(0)
{
}

// ----------------------------------------------------------------------
void Counter::slotInc()
{
    emit counterChanged(++m_nValue);

    if (m_nValue == 5) {
        emit goodbye();
    }
}

Автор: borisbn 17.2.2011, 09:49
Цитата(Enchance @  17.2.2011,  02:58 Найти цитируемый пост)
как сделать, чтобы цифра и кнопка находились в одном окне?

Код

int main (int argc, char** argv)
{
    QApplication app(argc, argv);

     QWidget w;

    QLabel      lbl("0", &w);
    QPushButton cmd("ADD", &w);
    Counter     counter;

//    lbl.show();
//    cmd.show();

     QVBoxLayout * verticalLayout = new QVBoxLayout( &w );
     verticalLayout->addWidget( &lbl );
     verticalLayout->addWidget( &cmd );

     w.show();
...


Цитата(Enchance @  17.2.2011,  02:58 Найти цитируемый пост)
И как вставить область, в которой будут меняющиеся картинки?

QLabel::setPixmap ?

Цитата(Enchance @  17.2.2011,  02:58 Найти цитируемый пост)
Документация только на инглише

Программист обязан знать инглиш. Учи, учи и исчо раз учи (С) сам знаешь кто smile

Автор: Enchance 18.2.2011, 00:22
Цитата

QLabel::setPixmap


Спасибо большое!
А как сделать, чтобы независимо от ширины исходного изображения, то, что выводит программа было, скажем, 300 пикс.? (я нашел, как обрезать "лишнюю" часть, а мне нужно, чтобы изображение сжималось/растягивалось)

Автор: borisbn 18.2.2011, 09:20
Цитата(Enchance @  18.2.2011,  00:22 Найти цитируемый пост)
как сделать, чтобы независимо от ширины исходного изображения

Код

QLabel::setScaledContents( true );



Enchance, а ты в справку (Qt Assistant) заглядываешь ?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)