Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: jojahti от Август 17, 2009, 17:53



Название: Почему не меняется толщина круга?
Отправлено: jojahti от Август 17, 2009, 17:53
Почему не меняется толщина круга при нажатии на кнопку?

paint.h
Код:
#ifndef PAINT_H
#define PAINT_H
#include <QDialog>

class QPushButton;

class PaintBoard : public QDialog
{
  Q_OBJECT
public:
  PaintBoard(QWidget *parent = 0);
  void paintEvent(QPaintEvent *event);
signals:
private slots:
     void cpaint();

private:
QPushButton *rbutton;
};
#endif

paint.cpp
Код:
#include <QtGui>
#include "paint.h"

PaintBoard::PaintBoard(QWidget *parent) : QDialog(parent)
{
   rbutton = new QPushButton(tr("gav"));
   QHBoxLayout *bottom = new  QHBoxLayout;
   bottom->addWidget(rbutton);
   setLayout(bottom);

  connect(rbutton, SIGNAL(clicked()), this, SLOT(cpaint()));  
}

  void PaintBoard::paintEvent(QPaintEvent *event)
{
   QPainter painter(this);
   painter.drawEllipse(10, 10, 20, 20);
}

void PaintBoard::cpaint()
{
  QPainter painter(this);
  painter.setPen(QPen(Qt::black, 9, Qt::SolidLine, Qt::RoundCap));
// painter.drawEllipse(10, 10, 90, 90);
  update();
}

main.cpp
Код:
#include <QApplication>
#include <QPainter>
#include "paint.h"

int main(int argc, char **argv) {
QApplication app(argc, argv);
   PaintBoard *form = new PaintBoard;
   form->show();
   return app.exec();
}


Название: Re: Почему не меняется толщина круга?
Отправлено: lit-uriy от Август 17, 2009, 17:56
потому что рисовать на виджете можно только в его обработчике события paintEvent


Название: Re: Почему не меняется толщина круга?
Отправлено: jojahti от Август 17, 2009, 19:45
lit-uriy пишет:
Цитировать
потому что рисовать на виджете можно только в его обработчике события paintEvent
Ну во первых я там ничего не рисовал, во вторых - вот я рисую не в paintEvent, и модифицирую кнопочкой толщину.
1) Тоесть вопрос уже такой - почему в прошлом примере это не получается?

2) Вопрос можно несколько конкретизировать.
Я смогу только с помощью QPaint перевести своего самопального пакмэна в графический режим? Или мне полюбому придётся разбираться ещё и в Graphics vievs framevork?
Подходит ли вообще QPaint для этой задачи?

renderarea.h

Код:
#ifndef RENDERAREA_H
#define RENDERAREA_H

#include <QPainterPath>
#include <QWidget>

class RenderArea : public QWidget
{ Q_OBJECT
  public:
    RenderArea(const QPainterPath &path, QWidget *parent = 0);

 public slots:
    void chlinewidth();
 protected:
    void paintEvent(QPaintEvent *event);
 private:
    QPainterPath path;
    int penwidth;
};

#endif  


window.h
Код:
#ifndef WINDOW_H
 #define WINDOW_H

 #include <QWidget>

class QPushButton;
class RenderArea;

class Window : public QWidget
 {
     Q_OBJECT

 public:
     Window();
 private slots:
 private:
     RenderArea *renderAreas;
     QPushButton *movebutton;
 };
 #endif



//====================================//
renderarea.cpp
Цитировать
#include <QtGui>
#include "renderarea.h"

RenderArea::RenderArea(const QPainterPath &path, QWidget *parent)
: QWidget(parent), path(path)
{
 penwidth = 1;
 setBackgroundRole(QPalette::Base);
}

void RenderArea::chlinewidth()
{
   penwidth=20;
   update();
}

void RenderArea::paintEvent(QPaintEvent *)
{
     QPainter painter(this);
     painter.setRenderHint(QPainter::Antialiasing);
     painter.scale(width() / 100.0, height() / 100.0);
     painter.translate(50.0, 50.0);
     painter.translate(-50.0, -50.0);

     painter.setPen(QPen(Qt::black, penwidth, Qt::SolidLine, Qt::RoundCap));

     QLinearGradient gradient(0, 0, 0, 100);
     painter.setBrush(gradient);
     painter.drawPath(path);
}
//==============================================//

window.cpp
Код:
#include <QtGui>
 #include <math.h>

 #include "renderarea.h"
 #include "window.h"

 const float Pi = 3.14159f;

 Window::Window()
 {  
     QPainterPath rectPath;
      rectPath.moveTo(80.0, 50.0);
      rectPath.arcTo(20.0, 30.0, 60.0, 40.0, 0.0, 360.0);
      rectPath.closeSubpath();

  
     renderAreas = new RenderArea(rectPath);
     movebutton = new QPushButton(tr("Mov"));

     connect(movebutton, SIGNAL(clicked()), renderAreas, SLOT(chlinewidth()));
 
     QGridLayout *topLayout = new QGridLayout;
         topLayout->addWidget(renderAreas);

     QGridLayout *mainLayout = new QGridLayout;
        mainLayout->addLayout(topLayout, 0, 0, 1, 4);
        mainLayout->addWidget(movebutton);
        setLayout(mainLayout);
  
        setWindowTitle(tr("Painter Paths"));
 }


main.cpp
Код:
#include <QApplication>

 #include "window.h"

 int main(int argc, char *argv[])
 {
     QApplication app(argc, argv);
     Window window;
     window.show();
     return app.exec();
 }


Название: Re: Почему не меняется толщина круга?
Отправлено: boobsik от Август 18, 2009, 12:21
ты создаешь в paintEvent новый обьект QPainter, не тот который в слоте cpaint(), просто сделай QPainter ellipse_painter членом класса RenderArea
class RenderArea : public QWidget
{
   QPainter ellipse_painter;
 public:
   setElipsePen(QPen pen);
...
  


Название: Re: Почему не меняется толщина круга?
Отправлено: jojahti от Август 19, 2009, 08:21
Ну не знаю. Вообщем я такой вывод сделал, что QPainter для таких вещей банально непредназначен.
С помощью него удобно отрисовать и преобразовать что-то статичное. Тоесть отрисует он только в момент создания формы. Единственное, что можно сделать после - накладывать маски и играться с пером.

А для отрисовки всяких движущихся/перекрывающихся/сталкивающихся вещей в QT есть графическая среда Graphics View Framework, в виде модели - сцена-предмет-отображение. В которую сейчас и вкуриваюсь.  :-\

Вот чё так несправедливо!? По делфи целые библиотеки о том, как перетаскивать на формочку кнопочки.
А по QT, где %:нешься, пока разберёшься, каких-то две книжечки, явно обделённых примерами.


Название: Re: Почему не меняется толщина круга?
Отправлено: ритт от Август 19, 2009, 08:41
все умозаключения предыдущего поста неверны...кроме "есть графическая среда Graphics View Framework".
зы: s/QT/Qt/g


Название: Re: Почему не меняется толщина круга?
Отправлено: jojahti от Август 19, 2009, 10:20
boobsik
Ну создам я его там и что мне это даст? Блин, я нефига не понял чё это мне даст.  ???
Если у меня объект класса renderarea создаётся и инициализируется изображением в конструкторе.

Я смогу этот объект переинициализировать впоследствии? И как-то коряво выходит и слишком через ж. - заного сцену пересоздавать.

Константин
Цитировать
все умозаключения предыдущего поста неверны...кроме "есть графическая среда Graphics View Framework".
Тоесть для делфи существует очень мало учебников? Учебников по QT много больше чем по делфи? А пример из  ассистента где столкновения/перекрывания/скорость/направление движения объектов обрабатывались только средствами Graphics View Framework мне почудился?  ???


Название: Re: Почему не меняется толщина круга?
Отправлено: ритт от Август 19, 2009, 10:53
1. мне неинтересно пререкаться с тобой на данную тему. унас имеется прикреплённая ветка, в которой перечислено множество печатных и электронных изданий непосредственно по Qt. имеющий глаза...

2. в составе Qt поставляется отличная документация, заменяющая десятки толстых и умных книг типа "делфи для чайников" и т.п.

3. подобные вопросы уже ни один раз задавались на данном форуме - просто воспользуйся поиском.