Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt] Как применить сигнал в даной программе? 
:(
    Опции темы
Enchance
Дата 8.3.2011, 03:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 20.10.2009

Репутация: нет
Всего: нет



Здравствуйте.
У меня есть код:

Код

#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.

Как реализовать? У меня что бы я не делал, как бы я не изворачивался, изображение не меняется. Про сигналы в общих чертах знаю, но не знаю, как их здесь применить.
PM MAIL   Вверх
loneybibi
Дата 8.3.2011, 03:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.5.2010
Где: Донецк (Украина)

Репутация: 3
Всего: 3



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


--------------------
Red Hat Fedora 17
Qt 4.8.1 (x64), GCC 4.4.3,
G++ 4.4.3, QtCreator 2.4.1
PM MAIL ICQ   Вверх
borisbn
Дата 8.3.2011, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



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();
}



Это сообщение отредактировал(а) borisbn - 8.3.2011, 09:59


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Enchance
Дата 10.3.2011, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 20.10.2009

Репутация: нет
Всего: нет



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

class MyWidget : public QWidget {

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

error: invalid use of incomplete type ‘struct QWidget’

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

Шлее читаю, гугл тоже курю, но пока плохо все получается...
PM MAIL   Вверх
borisbn
Дата 10.3.2011, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



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

class MyWidget : public QWidget {


Код

#include <QWidget>



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Enchance
Дата 10.3.2011, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 20.10.2009

Репутация: нет
Всего: нет



Ок, но это не все еще.
Строка
Код

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-файле он говорит, что они не обьявлены.
PM MAIL   Вверх
Modul
Дата 10.3.2011, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 17.2.2006

Репутация: нет
Всего: нет



Кошмариус просто !  smile 

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

#include <QtGui>


Но правильно эти виджеты подключать.
--------------------
I'll be back !
PM MAIL   Вверх
borisbn
Дата 11.3.2011, 07:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



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


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Sality123
Дата 11.3.2011, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 10.3.2011

Репутация: нет
Всего: нет



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

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

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

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

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


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

PM MAIL   Вверх
borisbn
Дата 11.3.2011, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



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

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

class QLabel;
class QPushButton;


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

Это сообщение отредактировал(а) borisbn - 11.3.2011, 23:36


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
popeye
Дата 26.3.2011, 01:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 26.3.2011

Репутация: нет
Всего: нет



можно не подключать 
class QLabel;
class QPushButton;

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

 #include <QtGui>

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

Это сообщение отредактировал(а) popeye - 26.3.2011, 01:33
PM MAIL   Вверх
borisbn
Дата 26.3.2011, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(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 Найти цитируемый пост)
т.к. эти классы производные от него

от кого ?
в Си++ нет производных. есть только наследование

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

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

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

Это сообщение отредактировал(а) borisbn - 26.3.2011, 13:25


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1292 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.