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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите разобраться с рисованием в Qt.  (Прочитано 15937 раз)
madgere
Гость
« : Октябрь 07, 2007, 12:32 »

Никак не могу с этим разобраться. Нужно выводить поверх картинки на пиксмапе геометрические фигуры, но никак не могу разобраться с рисование, а именно как указать на чем выводить. Ассистант уже до дыр зачитал, Шлее и Бланшетт, в гугли искал, по форуму тоже. Но так ничего и не понял. Помогите разобраться, пожалуйста.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Октябрь 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
« Последнее редактирование: Октябрь 07, 2007, 12:46 от pastor » Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
dilshodm
Новичок

Offline Offline

Сообщений: 18


Просмотр профиля
« Ответ #2 : Октябрь 07, 2007, 12:50 »

Например:

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

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

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

С уважением,
Dilshod
madgere
Гость
« Ответ #3 : Октябрь 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();
« Последнее редактирование: Октябрь 09, 2007, 23:49 от madgere » Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #4 : Октябрь 10, 2007, 00:04 »

Честно говоря вопрос непонятен  Непонимающий
Если ваш код не работает, так приведите его

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

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

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
madgere
Гость
« Ответ #5 : Октябрь 10, 2007, 00:16 »

чёрт. допер в чем дело. Я пытался рисовать уже после вывода картинки на имэйджлэйбл. Поэтому на экране фигуры и не отрисовывались.
Записан
madgere
Гость
« Ответ #6 : Октябрь 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 всё ОК.
От чего такой эффект?
Записан
ритт
Гость
« Ответ #7 : Октябрь 10, 2007, 02:13 »

нда...ссылка на рсдновские рулезы не пошла впрок

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

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

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

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

в пиксмапе пнг-шка, рисуем на пиксмапе всякие кракозябры, рисуем пиксмап на виджете...
всё замечательно работает!
Записан
madgere
Гость
« Ответ #8 : Октябрь 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();
« Последнее редактирование: Октябрь 10, 2007, 10:38 от madgere » Записан
ритт
Гость
« Ответ #9 : Октябрь 10, 2007, 18:50 »

проверил твой "старый" код - всё работает, серый квадратик рисуется
вин32 хрень про сп2, кути4.3.2, жцц3.4.5
для чистоты эксперимента стоило бы для остальных форматов попробовать, но я ограничился несколькими наугад выбранными пнг-шками

так что, ищи причины где ещё
Записан
madgere
Гость
« Ответ #10 : Октябрь 11, 2007, 01:22 »

ага, спасибо. Интересно, что же это у меня за глюк...
Записан
ALF
Гость
« Ответ #11 : Март 22, 2008, 01:43 »

Всем привет!

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

Заранее всем приогромнейшее спасибо!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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