crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
Гость_Дмитрий_*
сообщение 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  


Спасибо большое! Праздники тут подвернулись, как-то руки не дошли всё испробовать. Всё работает просто супер. Вот только вопросы всё накапливаются и накапливаются... Если я снова хочу прорисовать новую фигуру, а старую удалить, то как это делать? Есть ли такая функция, которая удаляет с окна всё ранее нарисованное?
И как делать анимацию как в последнем сообщении?
Эскизы прикрепленных изображений
 Р В Р’ Р’ Р’ Р’ Р в‚¬Р В РЎВ˜Р В Р’µР Р…ьшено Р Т‘Р С• 54%
Прикрепленное изображение
578 x 342 (25.31 килобайт)
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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();
}


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

Эскизы прикрепленных изображений
 Р В Р’ Р’ Р’ Р’ Р в‚¬Р В РЎВ˜Р В Р’µР Р…ьшено Р Т‘Р С• 55%
Прикрепленное изображение
580 x 303 (12.68 килобайт)
 Р В Р’ Р’ Р’ Р’ Р в‚¬Р В РЎВ˜Р В Р’µР Р…ьшено Р Т‘Р С• 55%
Прикрепленное изображение
580 x 303 (12.68 килобайт)
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 4.5.2009, 8:20
Сообщение #11


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

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

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




Репутация:   23  


child_of_bodom,
вопрос как ты "рисуешь" на виджете? на картинке а потом её вставляешь когда тебе угодно?(извини весь код в теме не смотрел времени мало).
после любого вызова
update()
repaint()
вызовется paintEvent()
в котором непосредственно рисуется виджет
т.е. один из вариантов последовательности действий чтоб все перерисовалось. это
1. дождаться действия(нажатие на старт игры)
2. произвести необходимые изменения отрисовки.
3. вызвать update() Или repaint()

посмотрите как это делается в ${QTDIR}/examples/*
посмотрите Paint System
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 24.6.2025, 22:21