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


Автор: Enchance 8.3.2011, 03:30
Здравствуйте.
У меня есть код:

Код

#include <QtGui>

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

    QWidget w;

    QPixmap pix1;            //pix1 - это картинка "mira.jpg"
    pix1.load("mira.jpg");
    QPixmap pix2;            //pix2 - это картинка "mira2.jpg"
    pix2.load("mira2.jpg");

    QLabel xxl;                
    xxl.setScaledContents ( true );
    xxl.resize(50,50);
    xxl.setPixmap(pix1);        //здесь у нас выбрана pix1
    
    QPushButton cmd1("Photo 1", &w);
    QPushButton cmd2("Photo 2", &w);

    QVBoxLayout * verticalLayout = new QVBoxLayout( &w );
    verticalLayout->addWidget( &cmd1 );      //button1
    verticalLayout->addWidget( &cmd2 );      //button2
    verticalLayout->addWidget( &xxl );       //image
    w.show();

    return app.exec();
}


Нужно, чтобы при нажатии на кнопку "cmd1" выводилось изображение pix1,
а при нажатии на кнопку "cmd2" выводилось изображение pix2.

Как реализовать? У меня что бы я не делал, как бы я не изворачивался, изображение не меняется. Про сигналы в общих чертах знаю, но не знаю, как их здесь применить.

Автор: loneybibi 8.3.2011, 03:46
connect(<кнопка>,SIGNAL(clicked()),<указатель на родительский класс>,SLOT(<функция которая загружает рисунок>));
что то типа этого .. 

Автор: borisbn 8.3.2011, 09:58
loneybibi, connect - функция класса QObject. Она, конечно, статическая, и можно вызывать без создания экземпляра класса ( QObject::connect... ), но в данном случае это не подходит.


Enchance, для того, чтобы принимать сигналы, тебе необходимо создать свой класс, который наследовать как минимум от QObject (в данном случае лучше от QWidjet), описать в нём слоты, и коннектить сигналы от елементов интерфейса на эти слоты.
Типа такого:
h-файл
Код

class MyWidget : public QWidget {

Q_OBJECT

public:
    MyWidget( QWidget * parent = 0 );

private:
    QPixmap pix1;            //pix1 - это картинка "mira.jpg"
    QPixmap pix2;            //pix2 - это картинка "mira2.jpg"

    QLabel * xxl;                
    
    QPushButton * cmd1;
    QPushButton * cmd2;
private slots:
    void onCmd1();
    void onCmd2();
};

cpp-файл
Код

MyWidget::MyWidget( QWidget * parent /*= 0*/ )
    : QWidget()
{
    pix1.load("mira.jpg");
    pix2.load("mira2.jpg");

    xxl = new QLabel( this );
    xxl->setScaledContents ( true );
    xxl->resize(50,50);
    xxl->setPixmap(pix1);        //здесь у нас выбрана pix1

    cmd1 = new QPushButton( "Photo 1", this );
    cmd2 = new QPushButton( "Photo 2", this );

    verticalLayout = new QVBoxLayout( this );
    verticalLayout->addWidget( cmd1 );      //button1
    verticalLayout->addWidget( cmd2 );      //button2
    verticalLayout->addWidget( xxl );       //image

    connect( cmd1, SIGNAL( clicked() ), SLOT( onCmd1() ) );
    connect( cmd2, SIGNAL( clicked() ), SLOT( onCmd2() ) );
}

void MyWidget::onCmd1()
{
    xxl->setPixmap( pix1 );
}

void MyWidget::onCmd2()
{
    xxl->setPixmap( pix2 );
}

а в main будет просто
Код

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

    MyWidget w;
    w.show();

    return app.exec();
}


Автор: Enchance 10.3.2011, 17:52
h-файл выдает кучу ошибок. Например, на строку
Код

class MyWidget : public QWidget {

компилятор говорит 
Цитата

error: invalid use of incomplete type ‘struct QWidget’

а там дальше пошло-поехало.

Шлее читаю, гугл тоже курю, но пока плохо все получается...

Автор: borisbn 10.3.2011, 18:00
для того, чтобы наследоваться от какого-либо класса, необходимо включить описание этого класса в h-ник.
Просто напиши перед 
Код

class MyWidget : public QWidget {


Код

#include <QWidget>

Автор: Enchance 10.3.2011, 18:36
Ок, но это не все еще.
Строка
Код

QLabel * xxl;

говорит
Цитата

error: ISO C++ forbids declaration of ‘QLabel’ with no typeerror: ISO C++ forbids declaration of ‘QLabel’ with no type


На QPushButton компилятор говорит так же.
На xxl, cmd1, cmd2, verticalLayout в cpp-файле он говорит, что они не обьявлены.

Автор: Modul 10.3.2011, 20:16
Кошмариус просто !  smile 

В хедере (*.h) напишите:
Код

#include <QtGui>


Но правильно эти виджеты подключать.

Автор: borisbn 11.3.2011, 07:49
Enchance, в Qt предоставляются  замечательные примеры. Возьми пару-тройку из них и досконально разбери. Каждую строчку. А вообще, я б тебе посоветовал подучить Си++ перед тем, как браться за Qt. 

Автор: Sality123 11.3.2011, 16:19
Енчансе, я смотрю на твою проблему с низу, как и ты, не то что эти специ =) Я сам только 3 мес изучаю С++ и Qt

Вобщем, чтоб компилятор не ругался перед тем как использовать класс какой то (QPushButton или QLabel) или другие их нужно подключить, это лучше всего делать в .h файле с самого верха

например в твоем случае это:

#include <QPushButton>
#include < QLabel>
#include < QWidget>
#include < QPixmap>

и обязательно нужно подключить свой класс если ты используешь его функции


например #include "myclass.h"

Автор: borisbn 11.3.2011, 16:23
Цитата(Sality123 @  11.3.2011,  16:19 Найти цитируемый пост)
это лучше всего делать в .h файле

если используешь указатель на этот класс, то лучше подключать эти инклюды не в h-файле, а в cpp, а в h-файле делать только объявление типа
Код

class QLabel;
class QPushButton;


Это не будет заставлять того, кто использует твой класс, т.е. подключает твой h-ник, компилировать кучу других h-ников.

Автор: popeye 26.3.2011, 01:32
можно не подключать 
class QLabel;
class QPushButton;

просто подключи

 #include <QtGui>

 т.к. эти классы производные от него
а вообще советую читать документацию по Qt

Автор: borisbn 26.3.2011, 13:15
Цитата(popeye @  26.3.2011,  01:32 Найти цитируемый пост)
можно не подключать
class QLabel;
class QPushButton;

это - не подключение, а объявление.

Цитата(popeye @  26.3.2011,  01:32 Найти цитируемый пост)
просто подключи #include <QtGui>


Modul уже это советовал

Цитата(popeye @  26.3.2011,  01:32 Найти цитируемый пост)
т.к. эти классы производные от него

от кого ?
в Си++ нет http://ru.lmgtfy.com/?q=%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%B4%D0%BD%D0%B0%D1%8F&l=1. есть только http://ru.lmgtfy.com/?q=%D0%BD%D0%B0%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5+%D1%81%2B%2B

popeye, перед тем, как советовать, советую самому подучить мат.часть

Цитата(popeye @  26.3.2011,  01:32 Найти цитируемый пост)
а вообще советую читать документацию по Qt

единственный дельный совет

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