crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> QPaintEvent
Гость_Дмитрий_*
сообщение 28.4.2009, 23:23
Сообщение #1





Гости








    


Хочу нарисовать башенку из прямоугольников определённой высоты в зависимости от положения ползунка (при каждом изменении его положения башенка перерисовывается). Подскажите, пожалуйста, как это реализовать?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 29.4.2009, 2:40
Сообщение #2


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Накидал элементарный примерчик.
Рисуется квадрат в центре окна. Колесиком мыши изменяются его размеры.
Примерно то что просили. Что непонятно, спрашиваете :)

mypaint.h
#include <QtGui>

class MyForm : public QFrame
{
    Q_OBJECT
    QRect rect;

public:
    MyForm(QWidget *parent = 0) : QFrame(parent) {
        setMinimumSize(240,180);
        rect.setSize(QSize(25,25));
    }

protected:
    // событие перерисовки виджета
    void paintEvent(QPaintEvent *event) {
        QPainter painter(this);
        painter.setPen(Qt::blue);
        painter.setBrush(QBrush(Qt::red));

        // перемещаем наш прямоугорльник в центр данной области рисования
        rect.moveCenter(painter.window().center());
        // отрисовываем наш прямоугольник
        painter.drawRect(rect);
    }

    // событие вращения колесика мышки
    void wheelEvent (QWheelEvent *event) {
        // delta() возвратит +-120, в зависимости от направления вращения колесика мыши
        int step = event->delta() / 6;
        // изменяем размеры нашего прямоугольничка на 2*step
        rect.adjust(-step,-step, step,step);
        // делаем запросс на перерисовку виджета
        update();
    }
};

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
child_of_bodom
  опции профиля:
сообщение 30.4.2009, 1:05
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 30.4.2009
Пользователь №: 716

Спасибо сказали: 0 раз(а)




Репутация:   0  


Спасибо большое за пример!
А можно ли как-то связать объект QDial или QLCDNumber с событием прорисовки окна, чтобы в зависимости от их параметра N рисовалось N квадратиков?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 30.4.2009, 2:03
Сообщение #4


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Цитата(child_of_bodom @ 30.4.2009, 2:05) *
А можно ли как-то связать объект QDial или QLCDNumber с событием прорисовки окна, чтобы в зависимости от их параметра N рисовалось N квадратиков?
Да без проблем.
Только для начала рекомендую почитать вот это.

Для демонстрации переделал свой предыдущий пример. Код компилируемый.
paint.h
#include <QtGui>

class MyForm : public QFrame
{
    Q_OBJECT
    QRect rect;
    int numRect;

public:
    MyForm(QWidget *parent = 0) : QFrame(parent), numRect(1) {
        setMinimumSize(240,180);
        rect.setSize(QSize(25,25));
    }

protected:
    void paintEvent(QPaintEvent *event) {
        QPainter painter(this);
        painter.setPen(Qt::blue);
        painter.setBrush(QBrush(Qt::red));

        for(int i=0; i!=numRect; i++) {
            rect.moveCenter(QPoint(painter.window().left()+13, painter.window().center().y()) + QPoint(25*i, 0));
            painter.drawRect(rect);
        }

    }

public slots:
    void setNumRect(int num) {
        numRect = num;
        update();
    }
};
main.cpp
#include "paint.h"
#include <QtGui>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QDialog d;
    MyForm w;

    QDial *dial = new QDial();
    dial->setRange(1, 8);
    QHBoxLayout *hbl = new QHBoxLayout;
    hbl->addWidget(dial);
    hbl->addWidget(&w);
    d.setLayout(hbl);
    QObject::connect(dial, SIGNAL(valueChanged(int)), &w, SLOT(setNumRect(int)));

    d.show();
    return a.exec();
}



Сообщение отредактировал igor_bogomolov - 30.4.2009, 2:27
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
child_of_bodom
  опции профиля:
сообщение 3.5.2009, 21:07
Сообщение #5


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 30.4.2009
Пользователь №: 716

Спасибо сказали: 0 раз(а)




Репутация:   0  


Спасибо большое! Праздники тут подвернулись, как-то руки не дошли всё испробовать. Всё работает просто супер. Вот только вопросы всё накапливаются и накапливаются... Если я снова хочу прорисовать новую фигуру, а старую удалить, то как это делать? Есть ли такая функция, которая удаляет с окна всё ранее нарисованное?
И как делать анимацию как в последнем сообщении?
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 3.5.2009, 22:38
Сообщение #6


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Цитата(child_of_bodom @ 3.5.2009, 22:07) *
Спасибо большое! Праздники тут подвернулись, как-то руки не дошли всё испробовать. Всё работает просто супер. Вот только вопросы всё накапливаются и накапливаются... Если я снова хочу прорисовать новую фигуру, а старую удалить, то как это делать? Есть ли такая функция, которая удаляет с окна всё ранее нарисованное?

рисуйте поверх ничего не удаляя и всё естественно с самостоятельной отрисовкой фона.

этож гиф!

Сообщение отредактировал kwisp - 3.5.2009, 22:39
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
child_of_bodom
  опции профиля:
сообщение 3.5.2009, 23:27
Сообщение #7


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 30.4.2009
Пользователь №: 716

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(kwisp @ 3.5.2009, 23:38) *
всё естественно с самостоятельной отрисовкой фона


а как тогда сделать отрисовку фона?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 3.5.2009, 23:47
Сообщение #8


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


child_of_bodom, давай по порядку. Тот рисунок который ты выше привел, от куда он? Сам рисовал пирамидку?
Если сам, то по идее, вопросов о том, как происходит перерисовка виджета у тебя быть не должно. :unknw:

Цитата(child_of_bodom @ 4.5.2009, 0:27) *
а как тогда сделать отрисовку фона?
Либо через drawRect,
        painter.save();
        painter.setPen(Qt::yellow);
        painter.setBrush(QBrush(Qt::yellow));
        painter.drawRect(painter.window());
        painter.restore();
либо через QPalette
    QPalette palette;
    palette.setColor(QPalette::Normal,QPalette::Window,Qt::yellow);
    w.setPalette(palette);
    w.setAutoFillBackground(true);


Сообщение отредактировал igor_bogomolov - 4.5.2009, 0:19
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
child_of_bodom
  опции профиля:
сообщение 4.5.2009, 0:30
Сообщение #9


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 30.4.2009
Пользователь №: 716

Спасибо сказали: 0 раз(а)




Репутация:   0  


Раскрывающийся текст
void hantower_graph3::paintEvent(QPaintEvent * event)
{
        QPainter painter(this);
        painter.setPen(Qt::black);
        painter.setBrush(QBrush(Qt::red));
        if(numRect)
            {
                painter.setPen(QPen(Qt::blue, 4, Qt::SolidLine));
                painter.drawLine(280, 300, 580, 300); // горизонтальная ось
                painter.drawLine(430, 300, 430, 300 - 20 - 30 * numRect); // вертикальная ось
                painter.setPen(Qt::black);
            }

        for(int i = 0; i != numRect; i++)
        {
            switch (i)
            {
                    case 0: painter.setBrush(Qt::red); break;
                    case 1: painter.setBrush(QColor(255, 165, 0)); break; //orange
                    case 2: painter.setBrush(Qt::yellow); break;
                    case 3: painter.setBrush(Qt::green); break;
                    case 4: painter.setBrush(Qt::cyan); break;
                    case 5: painter.setBrush(Qt::blue); break;
                    case 6: painter.setBrush(Qt::magenta); break;
             }
            rect.setRect(290 + 20 * i, 270 - 30 * i, 280 - 40 * i, 30);
            painter.drawRect(rect);
        }
}


вот так нарисовал пирамиду, потом хочу нажать кнопку "Start Game!", при этом все элементы с этого окна должны исчезнуть.
Раскрывающийся текст
for(int i = 0; i != tower1; i++)
        {
            switch (i)
            {
                    case 0: painter.setBrush(Qt::red); break;
                    case 1: painter.setBrush(QColor(255, 165, 0)); break; //orange
                    case 2: painter.setBrush(Qt::yellow); break;
                    case 3: painter.setBrush(Qt::green); break;
                    case 4: painter.setBrush(Qt::cyan); break;
                    case 5: painter.setBrush(Qt::blue); break;
                    case 6: painter.setBrush(Qt::magenta); break;
             }
            rect.setRect(10 + 12 * i, 270 - 30 * i, 180 - 24 * i, 30);
            painter.drawRect(rect);
        }


for(int i = 0; i != tower1; i++)
        {
            switch (i)
            {
                    case 0: painter.setBrush(Qt::red); break;
                    case 1: painter.setBrush(QColor(255, 165, 0)); break; //orange
                    case 2: painter.setBrush(Qt::yellow); break;
                    case 3: painter.setBrush(Qt::green); break;
                    case 4: painter.setBrush(Qt::cyan); break;
                    case 5: painter.setBrush(Qt::blue); break;
                    case 6: painter.setBrush(Qt::magenta); break;
             }
            rect.setRect(10 + 12 * i, 270 - 30 * i, 180 - 24 * i, 30);
            painter.drawRect(rect);
        }

void hantower_graph3::Game()
{
    start->setVisible(false);
    lcd->setVisible(false);
    towheight->setVisible(false);
    
    tmp = numRect;
    numRect = 0;
    tower1 = tmp;
    update();
}


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

Раскрывающийся текст
void hantower_graph3::paintEvent(QPaintEvent * event)
{
        QPainter painter(this);
        painter.setPen(Qt::black);
        painter.setBrush(QBrush(Qt::red));
        if(numRect)
            {
                painter.setPen(QPen(Qt::blue, 4, Qt::SolidLine));
                painter.drawLine(280, 300, 580, 300); // горизонтальная ось
                painter.drawLine(430, 300, 430, 300 - 20 - 30 * numRect); // вертикальная ось
                painter.setPen(Qt::black);
            }

        for(int i = 0; i != numRect; i++)
        {
            switch (i)
            {
                    case 0: painter.setBrush(Qt::red); break;
                    case 1: painter.setBrush(QColor(255, 165, 0)); break; //orange
                    case 2: painter.setBrush(Qt::yellow); break;
                    case 3: painter.setBrush(Qt::green); break;
                    case 4: painter.setBrush(Qt::cyan); break;
                    case 5: painter.setBrush(Qt::blue); break;
                    case 6: painter.setBrush(Qt::magenta); break;
             }
            rect.setRect(290 + 20 * i, 270 - 30 * i, 280 - 40 * i, 30);
            painter.drawRect(rect);
        }
}


вот так нарисовал пирамиду, потом хочу нажать кнопку "Start Game!", при этом все элементы с этого окна должны исчезнуть.

Раскрывающийся текст
for(int i = 0; i != tower1; i++)
        {
            switch (i)
            {
                    case 0: painter.setBrush(Qt::red); break;
                    case 1: painter.setBrush(QColor(255, 165, 0)); break; //orange
                    case 2: painter.setBrush(Qt::yellow); break;
                    case 3: painter.setBrush(Qt::green); break;
                    case 4: painter.setBrush(Qt::cyan); break;
                    case 5: painter.setBrush(Qt::blue); break;
                    case 6: painter.setBrush(Qt::magenta); break;
             }
            rect.setRect(10 + 12 * i, 270 - 30 * i, 180 - 24 * i, 30);
            painter.drawRect(rect);
        }


for(int i = 0; i != tower1; i++)
        {
            switch (i)
            {
                    case 0: painter.setBrush(Qt::red); break;
                    case 1: painter.setBrush(QColor(255, 165, 0)); break; //orange
                    case 2: painter.setBrush(Qt::yellow); break;
                    case 3: painter.setBrush(Qt::green); break;
                    case 4: painter.setBrush(Qt::cyan); break;
                    case 5: painter.setBrush(Qt::blue); break;
                    case 6: painter.setBrush(Qt::magenta); break;
             }
            rect.setRect(10 + 12 * i, 270 - 30 * i, 180 - 24 * i, 30);
            painter.drawRect(rect);
        }

void hantower_graph3::Game()
{
    start->setVisible(false);
    lcd->setVisible(false);
    towheight->setVisible(false);
    
    tmp = numRect;
    numRect = 0;
    tower1 = tmp;
    update();
}


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

Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 4.5.2009, 0:41
Сообщение #10


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Справка по кнопкам и тэгам форума
Со switсh ты конечно жестко замутил. Уж больно огромный код получается. Использую хотябы QMap<int, QColor>

Сообщение отредактировал igor_bogomolov - 4.5.2009, 1:17
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 19.4.2024, 4:41