crossplatform.ru

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


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

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

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


Последние 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 Рейтинг@Mail.ru Текстовая версия Сейчас: 15.7.2025, 21:46