Russian Qt Forum
Ноябрь 25, 2024, 04:35 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Почему не меняется толщина круга?  (Прочитано 5448 раз)
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();
}
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Август 17, 2009, 17:56 »

потому что рисовать на виджете можно только в его обработчике события paintEvent
Записан

Юра.
jojahti
Гость
« Ответ #2 : Август 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();
 }
« Последнее редактирование: Август 17, 2009, 19:47 от jojahti » Записан
boobsik
Гость
« Ответ #3 : Август 18, 2009, 12:21 »

ты создаешь в paintEvent новый обьект QPainter, не тот который в слоте cpaint(), просто сделай QPainter ellipse_painter членом класса RenderArea
class RenderArea : public QWidget
{
   QPainter ellipse_painter;
 public:
   setElipsePen(QPen pen);
...
  
Записан
jojahti
Гость
« Ответ #4 : Август 19, 2009, 08:21 »

Ну не знаю. Вообщем я такой вывод сделал, что QPainter для таких вещей банально непредназначен.
С помощью него удобно отрисовать и преобразовать что-то статичное. Тоесть отрисует он только в момент создания формы. Единственное, что можно сделать после - накладывать маски и играться с пером.

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

Вот чё так несправедливо!? По делфи целые библиотеки о том, как перетаскивать на формочку кнопочки.
А по QT, где %:нешься, пока разберёшься, каких-то две книжечки, явно обделённых примерами.
Записан
ритт
Гость
« Ответ #5 : Август 19, 2009, 08:41 »

все умозаключения предыдущего поста неверны...кроме "есть графическая среда Graphics View Framework".
зы: s/QT/Qt/g
Записан
jojahti
Гость
« Ответ #6 : Август 19, 2009, 10:20 »

boobsik
Ну создам я его там и что мне это даст? Блин, я нефига не понял чё это мне даст.  Непонимающий
Если у меня объект класса renderarea создаётся и инициализируется изображением в конструкторе.

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

Константин
Цитировать
все умозаключения предыдущего поста неверны...кроме "есть графическая среда Graphics View Framework".
Тоесть для делфи существует очень мало учебников? Учебников по QT много больше чем по делфи? А пример из  ассистента где столкновения/перекрывания/скорость/направление движения объектов обрабатывались только средствами Graphics View Framework мне почудился?  Непонимающий
Записан
ритт
Гость
« Ответ #7 : Август 19, 2009, 10:53 »

1. мне неинтересно пререкаться с тобой на данную тему. унас имеется прикреплённая ветка, в которой перечислено множество печатных и электронных изданий непосредственно по Qt. имеющий глаза...

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

3. подобные вопросы уже ни один раз задавались на данном форуме - просто воспользуйся поиском.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.048 секунд. Запросов: 23.