crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Подскажите как работать с QPainter, Проблемы с отрисовкой с помошью QPainter
bayah
  опции профиля:
сообщение 18.5.2011, 16:44
Сообщение #1


Студент
*

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

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




Репутация:   0  


Не пойму как толком работает QPainter. Поэтому вот элементарный код который я тестил:

#include <QtGui/QApplication>
#include <QWidget>


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QWidget *b = new QWidget;                //Создаю QWidget
    QPainter *painter = new QPainter(*b);   //создаю QPainter, передаю ему указатель на QWidget.
    painter->drawLine(10, 10, 300, 300);   //рисую линию

    b->show();
    b->repaint();

    return a.exec();

}

В результате ничего не отображается. Почему?

Сразу задам мучающие меня вопросы по этому поводу:
- для чего метод begin(QPaintDevice*), если мы девайс для отрисовки указываем и так при создании?
- (собственно что мне нужно от этой отрисовки) как вывести на главный виджет какую нибудь область(другой виджет - QGraphicsView, например) и рисовать только на нем

мерси

Сообщение отредактировал bayah - 18.5.2011, 16:45
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 19.5.2011, 6:12
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Потому-что рисование осуществляется не в произвольном месте программы, а в обработчике события рисования QWidget::paintEvent.
Что приведено в элементарном примере из описания класса QPainter:
Цитата
Warning: When the paintdevice is a widget, QPainter can only be used inside a paintEvent() function or in a function called by paintEvent();
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
bayah
  опции профиля:
сообщение 20.5.2011, 10:03
Сообщение #3


Студент
*

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

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




Репутация:   0  


Да, спасибо, уже разобрался.

Короче придется наследовать класс, в нем переопределять QPaintEvent, потом создавать его динамически...
Поначитал тут столько извращений, типа как рисовать на дочернем виджете из родительского окна: перехватывать сообщения, вызывать отрисовку потомка, потом рисовать поверх. У меня все равно почему-то не заработало, но это ладно - от такого подхода я уже отказался.

Буду либо переопределять, либо рисовать на QGraphicsView с помошью QPainterPath, QGraphicsScene.
А эту тему можно закрыть и даже удалить лучше, - чтобы те, кто будет искать ответы на вопросы подобные моим в этой теме не спотыкались.)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
bayah
  опции профиля:
сообщение 20.5.2011, 18:31
Сообщение #4


Студент
*

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

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




Репутация:   0  


Хотя у меня че-то не работает даже примитивный код.
Тут я пытаюсь унаследовать от создать класс DrawWidget унаследовав его от QGraphicWidget переопределив в нем paintEvent и отрисовать в нем что нибудь.
Вот такой код. Почему не отрисовывается?


drawwidget.h
#ifndef DRAWWIDGET_H
#define DRAWWIDGET_H

#include <QtGui>

class DrawWidget : public QGraphicsView{

public:
    DrawWidget(QWidget *parent = 0);

protected:
    void paintEvent(QPaintEvent *event);

private:

};

#endif // DRAWWIDGET_H

drawwidget.cpp


drawwidget.cpp
#include "DrawWidget.h"
#include <QtGui>

DrawWidget::DrawWidget(QWidget* parent):
        QGraphicsView(parent)
{

}


void DrawWidget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.drawLine(10, 10, 40, 50);

}



main.cpp
#include <QtGui/QApplication>
#include "dialog.h"
#include "DrawWidget.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QWidget pWidget;
    DrawWidget pView(&pWidget);
    QVBoxLayout pLayout;
    pLayout.addWidget(&pView);

    pView.show();
    pWidget.setLayout(&pLayout);
    pWidget.show();

    return a.exec();
}


Сообщение отредактировал bayah - 20.5.2011, 18:32
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 20.5.2011, 21:10
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(bayah @ 20.5.2011, 21:31) *
унаследовав его от QGraphicWidget
а почему от QGraphicWidget, а не от QWidget?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
bayah
  опции профиля:
сообщение 21.5.2011, 1:48
Сообщение #6


Студент
*

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

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




Репутация:   0  



Цитата
а почему от QGraphicWidget, а не от QWidget?

Ой - QGraphicsView, а не QGraphicsWidget коечно же - это описка.

class DrawWidget : public QGraphicsView
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 21.5.2011, 7:12
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


ты что-то вообще не то делаешь.
В Qt есть два способа рисования: Артур (рисование в paintEvent виджета), и Грфическое представление (создание элементов на сцене и отображение их в представлении).

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
bayah
  опции профиля:
сообщение 21.5.2011, 10:52
Сообщение #8


Студент
*

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

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




Репутация:   0  


Цитата
ты что-то вообще не то делаешь.


а что я не то делаю? я переоределяю paintEvent у созданного мной потомка от QGraphicsView
QgraphicsView тут я использую как обычный виджет с возможностью рисовать на нем.


Цитата
В Qt есть два способа рисования: Артур (рисование в paintEvent виджета)

ну вот я и рисую так вроде бы?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
bayah
  опции профиля:
сообщение 21.5.2011, 15:42
Сообщение #9


Студент
*

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

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




Репутация:   0  


блин, унаследовался от QWidget и тогда только нарисовалось.
Но почему нельзя чтобы рисовалось на виджете наследованном от QGraphicsView?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 21.5.2011, 16:01
Сообщение #10


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(bayah @ 21.5.2011, 18:42) *
Но почему нельзя чтобы рисовалось на виджете наследованном от QGraphicsView?
а зачем!?!?!?!?

если тебе нужен велосипед с тремя колёсами, и у тебя будет выбор для основы - Простой велосипед, ..., БелАЗ.
Ты же не будешь за основу БелаАЗ(!) брать, правильно?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 15.12.2019, 0:29