Поиск:

Закрытая темаСоздание новой темы Создание опроса
> [QT] QPainter, QPixmap, paintEvent 
V
    Опции темы
Moby
Дата 28.11.2008, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем приает. Очередной вопрос от очередного нуба. smile
Вот почему у меня ничего не рисуется

Код

#include "paint_w.h"

paint_w::paint_w(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);
    Paint();
}

void paint_w::Paint()
{
    QPixmap img1("Paintball.jpg");
    QPainter painter(this);
    painter.drawPixmap(0,0,img1);
}


Объясните чайнику, зачем нужен paintEvent и где он вызывается? А то в QT примерах всюду есть эта функция, а где она вызывается не пойму.

PM MAIL ICQ   Вверх
Любитель
Дата 28.11.2008, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Вызывается тогда - когда надо перерисовать виджет smile Автоматически.


--------------------
PM MAIL ICQ Skype   Вверх
SABROG
Дата 28.11.2008, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



На экран не будет рисоваться:

Цитата

The QPixmap class is an off-screen image representation that can be used as a paint device


К тому же если бы ты даже один раз нарисовал что-то на окне, оно бы быстро затерлось оригинальным обработчиком paintEvent'a.

paintEvent вызывается всякий раз, когда приходит событие перерисовать окно. Поэтому, чтобы что-то нарисовать свое надо переопределить этот метод, вызвать в нем оригинальный метод (чтобы кнопочки увидеть и прочие контролы) и в конце метода нарисовать что-то свое поверх всего остального.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
gmorgunov
Дата 29.11.2008, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Привет. Вот так будет рисовать:
Код

#include <QtGui>

class MyWidget : public QWidget
{
  public:
   MyWidget(QWidget * parent=0) : QWidget(parent) {}
   
   void  paintEvent(QPaintEvent*) {       
      QPainter painter(this);
      QPixmap image("/home/mike/Desktop/lena.jpg");
      painter.drawPixmap(0,0,image);
      //QImage image("/home/mike/Desktop/lena.jpg");
      //painter.drawImage(100,100,image);
   } 
}; 

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);               
    MyWidget widget;
    QPainter painter;
    widget.show();
    return app.exec();              
}


PM MAIL   Вверх
Любитель
Дата 29.11.2008, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Должно )


--------------------
PM MAIL ICQ Skype   Вверх
Moby
Дата 2.12.2008, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Любитель @  29.11.2008,  17:53 Найти цитируемый пост)
Должно ) 

Не в моём случае.  smile 
Одно из двух, либо я не понимаю, либо я не догоняю.  smile 
Вот код.
Это хэдер
Код

#ifndef PAINT_W_H
#define PAINT_W_H
#include <QWidget>
#include "ui_paint_w.h"
#include <qpainter.h>
#include <QPixmap>
class paint_w : public QWidget
{
    Q_OBJECT

public:
    paint_w(QWidget *parent = 0);
    ~paint_w();
    
protected:
    void paintEvent(QPaintEvent *event);
    
private:

    Ui::paint_wClass ui;
};

#endif // PAINT_W_H


Это cpp
Код

#include "paint_w.h"

paint_w::paint_w(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);
}

void paint_w::paintEvent(QPaintEvent*)
{
    QPainter painter(this);
    QPixmap img1("C:\Documents and Settings\Tig\Рабочий стол\Paintball.jpg");
    painter.drawPixmap(0,0,img1);
}

Это main.cpp
Код

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    paint_w w;
    QPainter painter;
    w.show();
    return a.exec();
}





Не рисуется!!!  smile 
PM MAIL ICQ   Вверх
SABROG
Дата 2.12.2008, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(Moby @  2.12.2008,  12:34 Найти цитируемый пост)
 QPixmap img1("C:\Documents and Settings\Tig\Рабочий стол\Paintball.jpg");

Экранируем спец символы, экранируем ;)


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Elfebet
Дата 2.12.2008, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

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



Moby, в выше сказаном посте имееться ввиду шо в Qt используеться юникод а ты ему тулиш русские буквы в своей кодировке - поэтому и нерабоает, да и слэши должны быть наоборот smile


--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
Moby
Дата 3.12.2008, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Любитель, SABROG, gmorgunov, Elfebet, ОГРОМНОЕ вам спасибо. Слэышы перевернул, русские буквы убрал. Все работает.

Но я от вас не отстану. smile

У меня есть вопрос.

Как экранировать спец символы?



Это сообщение отредактировал(а) Moby - 3.12.2008, 15:46
PM MAIL ICQ   Вверх
SABROG
Дата 3.12.2008, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(Moby @ 3.12.2008,  15:45)
Любитель, SABROG, gmorgunov, Elfebet, ОГРОМНОЕ вам спасибо. Слэышы перевернул, русские буквы убрал. Все работает.

Но я от вас не отстану. smile

У меня есть вопрос.

Как экранировать спец символы?

"Спец.символы" это у меня от XML'я пошло. Имеется ввиду "escape sequence", эскейп последовательности.

Код

/-----------------------------------\
| ESCAPE     | CHARACTER REPRES-    |
| SEQUENCE   | ENTED                |
|------------+----------------------|
| "\a"       | Alert (bell, alarm)  |
|------------+----------------------|
| "\b"       | Backspace            |
|------------+----------------------|
| "\f"       | Form feed (new page) | 
|------------+----------------------|
| "\n"       | New-line             | 
|------------+----------------------|
| "\r"       | Carriage return      |
|------------+----------------------|
| "\t"       | Horizontal tab       | 
|------------+----------------------|
| "\v"       | Vertical tab         | 
|------------+----------------------|
| "\'"       | Single quotation     | 
|            | mark                 | 
|------------+----------------------|
| "\""       | Double quotation     | 
|            | mark                 | 
|------------+----------------------|
| "\?"       | Question mark        |
|------------+----------------------|
| "\\"       | Backslash            |
\-----------------------------------/



--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Moby
Дата 15.12.2008, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Появился вопросик. 

Вот тут 
Код

void new_form::paintEvent(QPaintEvent*)
{
    if(b)
    {
        k+=i;
    }
    QPainter painter(this);
    painter.drawPixmap(640 -X + k,0 + j,img1);
    painter.drawPixmap(640 - X - k,800 - Y - j,img2);
    update();
}


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

То есть я могу вручную прописывать с какой частатой должен метод paintEvent(QPaintEvent*) обновляться?

Или использовать QTimer? Если да, то подскажите как, ибо те примеры что есть не могу понять. smile
PM MAIL ICQ   Вверх
SABROG
Дата 15.12.2008, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Глянь пример 2D Painting Example, метод:

Код

 void Widget::animate()
 {
     elapsed = (elapsed + qobject_cast<QTimer*>(sender())->interval()) % 1000;
     repaint();
 }


Т.е. идет связка repaint() + QTimer(). repaint() нельзя использовать в методе paint, т.к. это вызовет рекурсию.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Moby
Дата 16.12.2008, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



В силу своих про знаний QT не могу понять что это делает 
Код

qobject_cast<QTimer*>(sender())->interval())


??

PM MAIL ICQ   Вверх
mes
Дата 16.12.2008, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Moby @  16.12.2008,  00:30 Найти цитируемый пост)
В силу своих про знаний QT не могу понять что это делает 

приводит sender (указатель на объект-инициатор вызвавший слот ) к типу QTimer* (если возможно) и вызывает для него метод QTimer::interval().

однако если animate() будет вызвана не как слот , а как простая функция, или инициатором будет не потомок QTimer, то qobject_cast<QTimer*>() вернет NULL. 


--------------------
PM MAIL WWW   Вверх
Moby
Дата 16.12.2008, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

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

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


 




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


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

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