Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: madgere от Октябрь 07, 2007, 12:32



Название: Помогите разобраться с рисованием в Qt.
Отправлено: madgere от Октябрь 07, 2007, 12:32
Никак не могу с этим разобраться. Нужно выводить поверх картинки на пиксмапе геометрические фигуры, но никак не могу разобраться с рисование, а именно как указать на чем выводить. Ассистант уже до дыр зачитал, Шлее и Бланшетт, в гугли искал, по форуму тоже. Но так ничего и не понял. Помогите разобраться, пожалуйста.


Название: Re: Помогите разобраться с рисованием в Qt.
Отправлено: pastor от Октябрь 07, 2007, 12:44
Цитировать
QImage image( <width>, <height()>, <Format>  );
image.fill( qRgb( 255, 255, 255 ) );

....

QPainter painter;
painter.begin( &image );
...
painter.end();

...

image.save( <file_fileName>, <format>);

Также можно использовать QPicture, QPixmap и др. См. QPaintDevice


Название: Re: Помогите разобраться с рисованием в Qt.
Отправлено: dilshodm от Октябрь 07, 2007, 12:50
Например:

Код:
QPixmap pixmap;
QPainter p(&pixmap);

p.drawRect(10,10, 100,100);

Т.к. QPixmap является QPaintDevice, то можно прямо на нем и рисовать с помощью QPainter


Название: Re: Помогите разобраться с рисованием в Qt.
Отправлено: madgere от Октябрь 09, 2007, 23:46
У меня ничего не выводится на экран. Как бы я не извращался. Может я вообще неправильно вывожу картинку на экран? Код я честно подсмотрел в кутэшных примерах и не совсем понимаю как он работает, вернее почему он работает только в таком виде.

мой код:


Код:
    imageLabel = new QLabel;
    imageLabel->setBackgroundRole(QPalette::Dark);
    imageLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
    imageLabel->setScaledContents(true);

    scrollArea = new QScrollArea;
    scrollArea->setBackgroundRole(QPalette::Dark);
    scrollArea->setWidget(imageLabel);
    setCentralWidget(scrollArea);

        QImage image(file_image);
        imageLabel->setPixmap(QPixmap::fromImage(image));
scaleFactor = 1.0;
actionFit_Window->setEnabled(true);
        updateActions();
        if (!actionFit_Window->isChecked())
               imageLabel->adjustSize();


Название: Re: Помогите разобраться с рисованием в Qt.
Отправлено: pastor от Октябрь 10, 2007, 00:04
Честно говоря вопрос непонятен  ???
Если ваш код не работает, так приведите его

А с кодом который вы привели все просто: в QScrollArea пометили QLabel, для QLabel установили картинку. Что непонятно?

ЗЫ: учимся правильно, понятно и лаконично задавать вопросы. Если вы что-то делаете, объясните что, приведите код, опишите задачу, что хотите получить. Советую заглянуть сюда http://rsdn.ru/Info/rules.xml


Название: Re: Помогите разобраться с рисованием в Qt.
Отправлено: madgere от Октябрь 10, 2007, 00:16
чёрт. допер в чем дело. Я пытался рисовать уже после вывода картинки на имэйджлэйбл. Поэтому на экране фигуры и не отрисовывались.


Название: Re: Помогите разобраться с рисованием в Qt.
Отправлено: madgere от Октябрь 10, 2007, 00:56
Хм, рисую фигуры на QImage поверх подгружаемой картинки так:

Код:
     QPainter painter;
     painter.begin( &image );
     painter.fillRect(10,10, 100,100,QBrush(Color(190,190,190)));
     painter.drawRect(9,9,101,101);
     painter.end();

Всё отлично рисуется при загрузке jpg и gif, но на png и bmp не хочет.
При рисовании на QPixmap всё ОК.
От чего такой эффект?


Название: Re: Помогите разобраться с рисованием в Qt.
Отправлено: ритт от Октябрь 10, 2007, 02:13
нда...ссылка на рсдновские рулезы не пошла впрок

когда рисуешь на купиксмапе, всё нормально...понятно (было бы странно, если бы не рисовалось)
а куда подгружаешь жпг/жиф/пнг?
приведи код, который НЕ работает!

Код:
pixmap = QPixmap(":/background.png");

QPainter paint;
paint.begin(&pixmap);
//собсна, рисование на paint
paint.end();

QPainter paint(this);
paint.drawPixmap(0, 0, pixmap);

в пиксмапе пнг-шка, рисуем на пиксмапе всякие кракозябры, рисуем пиксмап на виджете...
всё замечательно работает!


Название: Re: Помогите разобраться с рисованием в Qt.
Отправлено: madgere от Октябрь 10, 2007, 10:34
нда...ссылка на рсдновские рулезы не пошла впрок

Просто кто-то не умеет читать.
Выше код загрузки картинки я выкладывал, он такой:

Код:
    imageLabel = new QLabel;
    imageLabel->setBackgroundRole(QPalette::Dark);
    imageLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
    imageLabel->setScaledContents(true);

    scrollArea = new QScrollArea;
    scrollArea->setBackgroundRole(QPalette::Dark);
    scrollArea->setWidget(imageLabel);
    setCentralWidget(scrollArea);

        QImage image(file_image);
        imageLabel->setPixmap(QPixmap::fromImage(image));
scaleFactor = 1.0;
actionFit_Window->setEnabled(true);
        updateActions();
        if (!actionFit_Window->isChecked())
               imageLabel->adjustSize();

т.е. я подгружаю картинку в QImage, потом пихаю её в QPixmap и затем вывожу pixmap на QLabel.

Сначала я пробую рисовать на QImage таким образом:

Код:
     QPainter painter;
     painter.begin( &image );
     painter.fillRect(10,10, 100,100,QBrush(Color(190,190,190)));
     painter.drawRect(9,9,101,101);
     painter.end();

что в сочитаниии со старым кодом дает нам:

Код:
    imageLabel = new QLabel;
    imageLabel->setBackgroundRole(QPalette::Dark);
    imageLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
    imageLabel->setScaledContents(true);

    scrollArea = new QScrollArea;
    scrollArea->setBackgroundRole(QPalette::Dark);
    scrollArea->setWidget(imageLabel);
    setCentralWidget(scrollArea);

        QImage image(file_image);
        QPainter painter;
        painter.begin( &image );
        painter.fillRect(10,10, 100,100,QBrush(QColor(190,190,190)));
        painter.drawRect(9,9,101,101);
        painter.end();
        imageLabel->setPixmap(QPixmap::fromImage(image));
scaleFactor = 1.0;
actionFit_Window->setEnabled(true);
        updateActions();
        if (!actionFit_Window->isChecked())
               imageLabel->adjustSize();

Всё вроде рисуется нормально, но ТОЛЬКО на jpg и gif файлах. Поясняю - сама картинка выводится нормально будь то гиф, пнг или бмб, а вот прямоугольник на ней выводится только в случае гифа и джепега. Вот мне и интересно с чего такой эффект.
Хотя я в общем уже переписал код для рисования на pixmap'е, который рисует всегда:

Код:
    imageLabel = new QLabel;
    imageLabel->setBackgroundRole(QPalette::Dark);
    imageLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
    imageLabel->setScaledContents(true);

    scrollArea = new QScrollArea;
    scrollArea->setBackgroundRole(QPalette::Dark);
    scrollArea->setWidget(imageLabel);
    setCentralWidget(scrollArea);

        QImage image(file_image);
        QPixmap pix;
        pix=QPixmap::fromImage(image);
        QPainter painter;
        painter.begin(&pix);
        painter.fillRect(10,10, 100,100,QBrush(QColor(190,190,190)));
        painter.drawRect(9,9,101,101);
        painter.end();
        imageLabel->setPixmap(pix);
scaleFactor = 1.0;
actionFit_Window->setEnabled(true);
        updateActions();
        if (!actionFit_Window->isChecked())
               imageLabel->adjustSize();


Название: Re: Помогите разобраться с рисованием в Qt.
Отправлено: ритт от Октябрь 10, 2007, 18:50
проверил твой "старый" код - всё работает, серый квадратик рисуется
вин32 хрень про сп2, кути4.3.2, жцц3.4.5
для чистоты эксперимента стоило бы для остальных форматов попробовать, но я ограничился несколькими наугад выбранными пнг-шками

так что, ищи причины где ещё


Название: Re: Помогите разобраться с рисованием в Qt.
Отправлено: madgere от Октябрь 11, 2007, 01:22
ага, спасибо. Интересно, что же это у меня за глюк...


Название: Re: Помогите разобраться с рисованием в Qt.
Отправлено: ALF от Март 22, 2008, 01:43
Всем привет!

Помогите кто нибудь пожалуйста... мне нужно разработать приложение под никсой на основе QT в котором будет присутствовать 2д графика (можно сравнить с игрой "тетрис")... но вот праблема в том, что у меня нет ни знаний ни опыта работы с этой библиотекой... не могли бы вы порекомендовать какую нибудь литературу или еще какие нибудь полезные ссылки?

Заранее всем приогромнейшее спасибо!