Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: M9yT от Октябрь 25, 2010, 17:55



Название: Рисование примитивов
Отправлено: M9yT от Октябрь 25, 2010, 17:55
Здравствуйте. Искурил весь форум по 2D графике, но толком ничего не нашел.
Хочу нарисовать в окне простой прямоугольник! Но не рисуется!
Код:
//Widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPainter>
class Widget : public QWidget
{
    Q_OBJECT
public:
    explicit Widget(QWidget *parent = 0);
    virtual void PaintEvent(QPaintEvent *event);

signals:

public slots:

};

#endif // WIDGET_H
Код:
//Widget.cpp
#include "widget.h"
#include <QPainter>

Widget::Widget(QWidget *parent) :
    QWidget(parent)
{

}

void Widget::PaintEvent(QPaintEvent *event)
{
    QPainter paint;
    paint.begin(this);
    QPen pen(Qt::red, 12, Qt::SolidLine);
    QBrush brush(Qt::red, Qt::SolidPattern);
    paint.setBrush(brush);
    paint.setPen(pen);
    paint.drawRect(3,14, 100, 50);
    paint.end();
}
Код:
//main.cpp
#include <QtGui/QApplication>
#include <QTextCodec>
#include <QPainter>
#include "widget.h"
#include <QPushButton>
#include <QWidget>

void main (int argc, char *argv[])
{
    QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows1251"));
    QApplication app(argc, argv);
    Widget w;

    w.show();
    app.exec();
}
Вот что еще нужно сделать, чтобы нарисовался этот чёртов прямоугольник??


Название: Re: Рисование примитивов
Отправлено: GreatSnake от Октябрь 25, 2010, 18:00
Поменяй
void Widget::PaintEvent(QPaintEvent *event)
на
void Widget::paintEvent(QPaintEvent *event)


Название: Re: Рисование примитивов
Отправлено: M9yT от Октябрь 25, 2010, 18:03
Поменяй
void Widget::PaintEvent(QPaintEvent *event)
на
void Widget::paintEvent(QPaintEvent *event)
О,Ура! Но почему же во всех примерах paint c большой буквы????


Название: Re: Рисование примитивов
Отправлено: GreatSnake от Октябрь 25, 2010, 18:04
Цитировать
О,Ура! Но почему же во всех примерах paint c большой буквы?
Это где это?


Название: Re: Рисование примитивов
Отправлено: M9yT от Октябрь 25, 2010, 18:07
Цитировать
О,Ура! Но почему же во всех примерах paint c большой буквы?
Это где это?
Мдаа, ну я невнимательный(((( Такая мелочь((
Даже в методичке с маленькой)


Название: Re: Рисование примитивов
Отправлено: spirits25 от Декабрь 06, 2010, 20:45
решил не создавать новую тему. подскажите, как нарисовать 3D параллелепипед? У glu или glut есть специальные функции?


Название: Re: Рисование примитивов
Отправлено: Ubuntu_linux от Декабрь 14, 2010, 01:40
Нарисуй два квадрата, а вершинки соедини линиями. ;)


Название: Re: Рисование примитивов
Отправлено: Fat-Zer от Декабрь 14, 2010, 01:56
решил не создавать новую тему. подскажите, как нарисовать 3D параллелепипед? У glu или glut есть специальные функции?
вроде надо построить куб и растянуть/сжать его. Но ИМХО проще полигонами...


Название: Re: Рисование примитивов
Отправлено: spirits25 от Январь 16, 2011, 20:07
можете код подкинуть? да, я лодырь, но очень надо. спс.


Название: Re: Рисование примитивов
Отправлено: spirits25 от Январь 16, 2011, 21:40
нашёл параллелепипед=) только передняя грань не отображается почему-то у меня..=(
Код:
void piped(GLfloat a, GLfloat b, GLfloat c)
{
  glShadeModel(GL_FLAT);
  glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);

  glBegin(GL_QUAD_STRIP);
    glVertex3f(-a/2,-b/2,-c/2);
    glVertex3f(-a/2,-b/2, c/2);
    glVertex3f(-a/2, b/2,-c/2);
    glVertex3f(-a/2, b/2, c/2);

    glVertex3f( a/2, b/2,-c/2);
    glVertex3f( a/2, b/2, c/2);

    glVertex3f( a/2,-b/2,-c/2);
    glVertex3f( a/2,-b/2, c/2);

    glVertex3f(-a/2,-b/2,-c/2);
    glVertex3f(-a/2,-b/2, c/2);
  glEnd();

  glBegin(GL_QUADS);
    glVertex3f(-a/2,-b/2, c/2);
    glVertex3f(-a/2, b/2, c/2);
    glVertex3f( a/2, b/2, c/2);
    glVertex3f( a/2,-b/2, c/2);

    glVertex3f(-a/2,-b/2,-c/2);
    glVertex3f(-a/2, b/2,-c/2);
    glVertex3f( a/2, b/2,-c/2);
    glVertex3f( a/2,-b/2,-c/2);
  glEnd();
}


Название: Re: Рисование примитивов
Отправлено: BigHom от Май 11, 2011, 12:40
Подскажите : хотелось бы чтобы рисовалось по нажатию кнопки - не рисует . Что не так?

void graf::on_pushButton2_clicked()
{   
    QPainter paint;
    paint.begin(this);
    QPen pen(Qt::red, 12, Qt::SolidLine);
    QBrush brush(Qt::red, Qt::SolidPattern);
    paint.setBrush(brush);
    paint.setPen(pen);
    paint.drawRect(3,14, 100, 50);
    paint.end();
}


Название: Re: Рисование примитивов
Отправлено: GreatSnake от Май 11, 2011, 12:48
Отрисовка на виджете в Qt по дефолту возможна только в перегруженном paintEvent()
Код
C++ (Qt)
void graf::paintEvent ( QPaintEvent * event )
{  
   QPainter paint;
   paint.begin(this);
   QPen pen(Qt::red, 12, Qt::SolidLine);
   QBrush brush(Qt::red, Qt::SolidPattern);
   paint.setBrush(brush);
   paint.setPen(pen);
   paint.drawRect(3,14, 100, 50);
   paint.end();
}
 
void graf::on_pushButton2_clicked()
{
   update();
}


Название: Вызов из функции
Отправлено: Norrius от Декабрь 10, 2011, 19:06
А каким образом можно реализовать отрисовку по вызову из функции? То есть: существует некая функция, которая высчитывает координаты, и из нее по этим координатам должны строиться треугольники. Как я понял, QPainter это не может сделать, чем следует воспользоваться?


Название: Re: Вызов из функции
Отправлено: GreatSnake от Декабрь 10, 2011, 21:35
А каким образом можно реализовать отрисовку по вызову из функции? То есть: существует некая функция, которая высчитывает координаты, и из нее по этим координатам должны строиться треугольники. Как я понял, QPainter это не может сделать, чем следует воспользоваться?
Отрисовка в Qt делается только средствами QPainter.
Высчитывайте координаты в "некоей функции" и помещайте их в QPolygonF. И уже в paintEvent() отрисовывайте свои треугольники в QPainter::drawPolygon().
Всё просто)


Название: Re: Рисование примитивов
Отправлено: Norrius от Декабрь 10, 2011, 22:21
Спасибо, действительно несложно)