crossplatform.ru

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


  Ответ в Подскажите как работать с QPainter
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Litkevich Yuriy Дата 21.5.2011, 16:01
 
Цитата(bayah @ 21.5.2011, 18:42) *
Но почему нельзя чтобы рисовалось на виджете наследованном от QGraphicsView?
а зачем!?!?!?!?

если тебе нужен велосипед с тремя колёсами, и у тебя будет выбор для основы - Простой велосипед, ..., БелАЗ.
Ты же не будешь за основу БелаАЗ(!) брать, правильно?
bayah Дата 21.5.2011, 15:42
  блин, унаследовался от QWidget и тогда только нарисовалось.
Но почему нельзя чтобы рисовалось на виджете наследованном от QGraphicsView?
bayah Дата 21.5.2011, 10:52
 
Цитата
ты что-то вообще не то делаешь.


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


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

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

bayah Дата 21.5.2011, 1:48
 
Цитата
а почему от QGraphicWidget, а не от QWidget?

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

class DrawWidget : public QGraphicsView
Litkevich Yuriy Дата 20.5.2011, 21:10
 
Цитата(bayah @ 20.5.2011, 21:31) *
унаследовав его от QGraphicWidget
а почему от QGraphicWidget, а не от QWidget?
bayah Дата 20.5.2011, 18:31
  Хотя у меня че-то не работает даже примитивный код.
Тут я пытаюсь унаследовать от создать класс 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, 10:03
  Да, спасибо, уже разобрался.

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

Буду либо переопределять, либо рисовать на QGraphicsView с помошью QPainterPath, QGraphicsScene.
А эту тему можно закрыть и даже удалить лучше, - чтобы те, кто будет искать ответы на вопросы подобные моим в этой теме не спотыкались.)
Litkevich Yuriy Дата 19.5.2011, 6:12
  Потому-что рисование осуществляется не в произвольном месте программы, а в обработчике события рисования 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 Дата 18.5.2011, 16:44
  Не пойму как толком работает 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, например) и рисовать только на нем

мерси
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 29.3.2024, 11:56