Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.08.2009, 20:36   #1
jojahti
Подтвердите свой е-майл
 
Регистрация: 27.07.2009
Сообщений: 437
По умолчанию QT4. Динамическая отрисовка. Как?

Как отрисовывать картинку в процессе выполнения программы?
Я через операцию четырёхточия для соответствующего элемента создавал функцию paintEvent.
Но ведь всё это автоматически отрисовывается автоматически в момент создания элемента.

1) А если стоит задача рисовать на элементе во время исполнения программы по ситуации?
Примерчик плиииииз ^^

2) Как по человечески называется операция четырёхточия?
jojahti вне форума Ответить с цитированием
Старый 15.08.2009, 20:57   #2
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Два двоеточия - это операция разрешения области действия.
Есть два варианта - унарная и бинарная.
Используется для обращения к методам и аттрибутам класса, а также для создания ссылки на объект-член класса.
MaTBeu вне форума Ответить с цитированием
Старый 17.08.2009, 12:36   #3
jojahti
Подтвердите свой е-майл
 
Регистрация: 27.07.2009
Сообщений: 437
По умолчанию

Надо же, там примеры есть в ассистенте, оказывается.
jojahti вне форума Ответить с цитированием
Старый 17.08.2009, 17:27   #4
jojahti
Подтвердите свой е-майл
 
Регистрация: 27.07.2009
Сообщений: 437
По умолчанию

Там создаётся у класса renderarea метод PaintEvent. После этого этот класс может нарисоваться и обновиться через update(), если конечно вызывается из метода соответствующего класса.

Само изображение пихается в патч, которым инициализируется вновь созданный объект класса renderarea.
Все модификации изображения завязаны на модификации пера методами класса renderarea.

То есть этот класс ничего не знает про то, где и как рисуются фигуры. А рисуются они в конструкторе другого класса. И через его метод изменять фигурку не получается. Хотя операция аналогична тому, что происходит в renderarea. Тоесть апдейт я там вызываю, но к чему он относится? Если через :: вызываю его для другого класса компилятор меня лесом посылает.

:WALL: :WALL: :WALL:
У меня такое ощущение, что я пытаюсь пилить дрова молотком.
Все примеры что я нашёл, не изменяют нарисованные вещи напрямую.

Так это вообще реально, или у меня реально копыты из не того места ростут?
jojahti вне форума Ответить с цитированием
Старый 17.08.2009, 19:36   #5
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Цитата:
А рисуются они в конструкторе другого класса.
Вам что-то мешает перенести код рисования в метод, а не в конструктор?
MaTBeu вне форума Ответить с цитированием
Старый 17.08.2009, 20:54   #6
jojahti
Подтвердите свой е-майл
 
Регистрация: 27.07.2009
Сообщений: 437
По умолчанию

MaTBeu слушай, поправь в паре моих тестовых примерчиках что не так, плиииз? ^^

Здесь у меня не пашет отрисовка и смена толщины в методе:

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();
}
//===================================
//===================================

2) А здесь у меня пашет смена параметров пера в методе, но насчёт того куда куда засунуть дополнительный код рисования, я гм. несколько теряюсь.

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:aintEvent(QPaintEvent *)
{
* * QPainter painter(this);
* * painter.setRenderHint(QPainter::Ant ialiasing);
* * 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();
 }
jojahti вне форума Ответить с цитированием
Старый 18.08.2009, 11:14   #7
jojahti
Подтвердите свой е-майл
 
Регистрация: 27.07.2009
Сообщений: 437
По умолчанию

Ёлки иголки, ну ясен пень что нетак всё это делается!!! Там же в ассистенте совершенно чумовой пример с мышами и сыром!!
jojahti вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
QT4 segmentation fault jojahti Qt и кроссплатформенное программирование С/С++ 6 06.01.2010 09:57
Посоветуйте учебник по QT4 jojahti Общие вопросы C/C++ 2 06.08.2009 20:01
qt4, win32 и статическая линковка. ASGAlex Qt и кроссплатформенное программирование С/С++ 3 09.06.2009 09:13