crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

3 страниц V   1 2 3 >  
Ответить в данную темуНачать новую тему
> Обработка событий
skytrain
  опции профиля:
сообщение 3.3.2013, 19:38
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 3.3.2013
Пользователь №: 3734

Спасибо сказали: 0 раз(а)




Репутация:   0  


Добрый день всем.
Тут такое дело.
(программист из меня не сильно хороший, так что строго не судите)

Пытаюсь связать воедино механизм сигналов\слотов с событиями(просто для понимания процесса вообще)

Основываясь на статье
http://symmetrica.net/qt4/lesson3.htm
переписал код исключив класс OGLWindow.

=====widget.cpp=========
#include "widget.h"
#include "ui_widget.h"
#include<QPaintEvent>
#include<QImage>
#include<QPainter>


Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
Widget::ptrWiget = new QPaintEvent(ui->frame->rect()); // изменения здесь. (тип QPaintEvent ptrWiget;  )
}


void Widget::paintEvent(QPaintEvent *event)
{
    QImage image("zmey.jpg");
    QPainter paint(ui->frame);
    paint.drawImage(0,0,image);
}

void Widget::SendSignal()
{
    emit doit();
}

void Widget::ToDraw()
{
    
}

Widget::~Widget()
{
    delete ui;
}


Суть задачи:
Как сделать так, чтоб по нажатию кнопки происходила отрисовка не на виджете а на QFrame.
Суть вопроса:
1. Здесь в коде я сам в конструкторе класса создаю событие. Нужно-ли это???? Предполагаю что нет, но не представляю как реализовать.
Отсюда следует вопрос: Как заставить QFrame сгенерировать событие QpaintEvent по нажатию кнопки и как его обработать?
2. Так-как нельзя редактировать сигналы и слоты формы...... кому отсылать сигнал из формы, если сигналы и слоты могут соединяться только внутри одного класса.

Пока что так.
Если я не прав, прошу поправить.
С уважением.....
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 3.3.2013, 21:12
Сообщение #2


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Не вижу где вызываются SendSignal и ToDraw...

А так, предопределяем QFrame и в его paintEvent рисуем картинку.


PS: если нужна картинка без излишеств. То проще всего вставить QImage в QLabel. Это намного проще.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
skytrain
  опции профиля:
сообщение 3.3.2013, 23:17
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 3.3.2013
Пользователь №: 3734

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(RazrFalcon @ 3.3.2013, 22:12) *
Не вижу где вызываются SendSignal и ToDraw...


Пока нигде.
Я надеюсь заполнить их кодом.

Я хочу разобраться в механизме обработки событий.
От того и заморачиваюсь.

Цитата(RazrFalcon @ 3.3.2013, 22:12) *
А так, предопределяем QFrame и в его paintEvent рисуем картинку.


Можно отсюда поподробнее... плз
В смысле переопределяем.
Нужно новый обьект QFrame... или новый класс QFrame

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 3.3.2013, 23:38
Сообщение #4


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Нужно наследоваться от QFrame.
То есть создать новый класс, родителем которого будет QFrame.

Типа:
#include <QFrame>

class PreviewFrame : public QFrame
{
    Q_OBJECT

public:
    explicit PreviewFrame(QWidget *parent = 0);
    void drawImage(const QImage &img);

private:
        QImage m_image;

protected:
    void paintEvent(QPaintEvent *event);
};


PreviewFrame::PreviewFrame(QWidget *parent) :
    QFrame(parent)
{

}

void PreviewFrame::drawImage(onst QImage &img)
{
    m_image = img;
    update();
}

void PreviewFrame::paintEvent(QPaintEvent *event)
{
    QFrame::paintEvent(event);
    QPainter painter(this);
    painter.drawImage(m_img); // не помню как там точно функция называется
}


Сообщение отредактировал RazrFalcon - 3.3.2013, 23:40
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
skytrain
  опции профиля:
сообщение 4.3.2013, 0:25
Сообщение #5


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 3.3.2013
Пользователь №: 3734

Спасибо сказали: 0 раз(а)




Репутация:   0  


Ну да. В принципе вернулись к первоисточнику...
При создании экземпляра PreviewFrame в конструктор передаем имя объекта формы на которой будем рисовать.
Так?
Тогда зачем функция drawImage?
Она как-то сгенерирует событие?
Если так, то можно ее оформить в виде слота?

Цитата(RazrFalcon @ 4.3.2013, 0:38) *
void PreviewFrame::drawImage(onst QImage &img)
{
    m_image = img;
    update();
}


}


Спасибо.

Сори.
Цитата(skytrain @ 4.3.2013, 1:13) *
Как доставляются события
Когда происходит событие, то для его представления Qt создаёт объект события, - создавая экземпляр соответствующего подкласса QEvent, - и доставляет его отдельному экземпляру класса QObject (или одного из его подклассов), вызывая его функцию event().

Эта функция не обрабатывает событие сама; основываясь на типе доставленного события, она вызывает обработчик событий для данного конкретного типа события и отправляет ответ на основе того, будет ли событие принято или проигнорировано.

Некоторые события, например, QMouseEvent и QKeyEvent, поступают из оконной системы; некоторые, например, QTimerEvent, поступают из других источников; некоторые поступают из самого приложения.

Это отсюда http://doc.crossplatform.ru/qt/4.6.x/eventsandfilters.html

Если можно, то посвятите. Когда наступает событие QPaintEvent
И еще раз извините, за то, что задаю такие простые вопросы.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 4.3.2013, 0:29
Сообщение #6


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Цитата
Тогда зачем функция drawImage?
Она как-то сгенерирует событие?
Ыыыы, нет. paintEvent обычно вызывается сам по себе или через update();
и каждый раз нужно перерисовывать картинку, в данном случае.

По сути в paintEvent вы должны рисовать все что нужно. Но сам paintEvent вы не вызываете.

Сообщение отредактировал RazrFalcon - 4.3.2013, 0:30
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
skytrain
  опции профиля:
сообщение 4.3.2013, 1:07
Сообщение #7


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 3.3.2013
Пользователь №: 3734

Спасибо сказали: 0 раз(а)




Репутация:   0  


Спасибо.

Надо это как то переварить.
Попробую drawImage оформить слотом.
Ох ну дела.....

Отпишусь потом. Если получится.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
skytrain
  опции профиля:
сообщение 4.3.2013, 2:05
Сообщение #8


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 3.3.2013
Пользователь №: 3734

Спасибо сказали: 0 раз(а)




Репутация:   0  


Так вот.
#include "widget.h"
#include "ui_widget.h"
#include<previewframe.h>
#include<QPaintEvent>
#include<QImage>
#include<QPainter>


Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    QImage image("zmey.jpg");
Widget::ptrWiget = new PreviewFrame(ui->frame);
QObject::connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(drawImage(QImage)));
}


Widget::~Widget()
{
    delete ui;
}


#include <QWidget>
#include<previewframe.h>
namespace Ui {
class Widget;
}


class Widget : public QWidget
{
    Q_OBJECT
    
public:
    explicit Widget(QWidget *parent = 0);

    ~Widget();

    void SendSignal();

private:
    Ui::Widget *ui;
    PreviewFrame * ptrWiget;
    QImage m_image;
public slots:
    void drawImage(const QImage &img);

};

#endif // WIDGET_H


Основная задумка - использовать слот drawImage для перерисовки.
Естественно куча ошибок :(

#include "previewframe.h"

PreviewFrame::PreviewFrame(QWidget *parent) :
    QWidget(parent)
{
}
void Widget::drawImage(const QImage &img)
{
    m_image = img;
        update();
}

void PreviewFrame::paintEvent(QPaintEvent *event)
{

    QPainter paint(ui->frame);
    paint.drawImage(0,0,image);
}



#ifndef PREVIEWFRAME_H
#define PREVIEWFRAME_H

#include <QWidget>
#include<QFrame>
#include "widget.h"

class PreviewFrame : public QFrame

{
    Q_OBJECT
public:
    explicit PreviewFrame(QWidget *parent);


protected:
    void paintEvent(QPaintEvent *event);
    
};

#endif // PREVIEWFRAME_H


Я не знаю. Если это оффтоп, то смело удаляйте, но.... В голове каша получилась.
Основная задумка - это использование кнопки для перерисовки изображения.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 4.3.2013, 8:20
Сообщение #9


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


QObject::connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(drawImage(QImage)));

Количество аргументов в слоте должно быть меньше или равно количеству аргументов сигнала.

Кстати метод update () тоже является слотом. Можно к нему подсоединится.

PreviewFrame должен быть дочерним у виджета по идее (а то получается что один фрейм внутри другого).
Удали его из дизайнера и в коде добавляй в нужный лэйаут.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 4.3.2013, 8:28
Сообщение #10


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  



Цитата(lanz @ 4.3.2013, 11:20) *
Количество аргументов в слоте должно быть меньше или равно количеству аргументов сигнала.

точно ? Вроде бы их прототипы должны быть идентичны всегда

Сообщение отредактировал Алексей1153 - 4.3.2013, 8:28
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V   1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 24.4.2024, 19:20