Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt GUI _ Вставка изображения на QWidget

Автор: Andrewshkovskii 1.1.2009, 16:33

Не пойму, каким методом?
Например, есть у меня объект класса QWidget и QImage.
Создаю объект QImage :
QImage MyImage = new QImage("newyear09.gif","GIF");

как мне разместить это изображение на виджете?

Автор: fsMark 1.1.2009, 17:08

На каком виджите ты хочешь размешать изображение? В общем случае его можно просто нарисовать на виджите, смотри методы отрисовки виджетов...

Автор: Andrewshkovskii 1.1.2009, 17:10

да я попробовал следующие :
MyImage = new QImage("C:\\storage\\programming\\workspace\\1\\1.gif");
WidgetForImage = new QWidget;
Painter = new QPainter(WidgetForImage);
Painter->drawImage(0,0,*MyImage);
// LayoutForImage->addWidget(MyImage);
// this->addLayout(LayoutForImage);
this->WidgetForImage->show();

- ноль реации...

Автор: trdm 1.1.2009, 18:19

и не должно быть.
ты должен выполнять этот код:
drawImage(0,0,*MyImage);
В событии виджета paintEvent(...).
Есть вариант попроще: размести на виджете QLabel и засунь в QLabel пиксмап.

Автор: Andrewshkovskii 1.1.2009, 18:27

то есть нету простого способа создать виджет с изображением вставленным?..

Автор: Litkevich Yuriy 1.1.2009, 19:31

Цитата(Andrewshkovskii @ 1.1.2009, 21:27) *
то есть нету простого способа создать виджет с изображением вставленным?..
виджет для изображений - http://doc.crossplatform.ru/qt/4.3.2/qlabel.html
изображение устанавливается методами:
http://doc.crossplatform.ru/qt/4.3.2/qlabel.html#pixmap-prop
http://doc.crossplatform.ru/qt/4.3.2/qlabel.html#setPicture

например:
#include <QtGui>
int main(int argc, char** argv)
{
  QApplication app(argc, argv);
  QLabel    lb;
  QPixmap    pix;

    pix.load("./newyear09.gif");    
    lb.setPixmap(pix);
    lb.show();
    
    return app.exec();
}

Автор: Andrewshkovskii 1.1.2009, 23:56

Хм..странно, но метка просто-напросто не показывается..

Автор: Litkevich Yuriy 2.1.2009, 1:01

Цитата(Andrewshkovskii @ 2.1.2009, 2:56) *
Хм..странно, но метка просто-напросто не показывается..
значит файла newyear09.gif нет в каталоге с бинарем. Проверь.

Автор: Andrewshkovskii 2.1.2009, 1:06

да я проверял, и так и сяк...пишу вот так вот :

#include <QtGui>
int main(int argc, char** argv)
{
  QApplication app(argc, argv);
  QPixmap pix;
  QLabel lbl;
if(pix.load("1.jpg")==false)
     lbl.setText("FALSE");
else
      lbl.setText("TRUE");
lbl.resize(pix.size());
  lbl.setPixmap(pix);
  lbl.show();
    return app.exec();
}


сплошной false показывает..

Автор: Litkevich Yuriy 2.1.2009, 1:17

вот тестовый пример:
 Qt_test2.zip ( 37.28 килобайт ) : 184

скомпиль (qmake && make) и запусти отладочную версию ./build/tstd.exe
посмотри, что пишет в консоль.

затем в каталог ./build закинь файл av-64.gif и опять запусти отладочную версию ./build/tstd.exe

Автор: Andrewshkovskii 2.1.2009, 1:24

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

Автор: Litkevich Yuriy 2.1.2009, 1:41

Цитата(Andrewshkovskii @ 2.1.2009, 4:24) *
мда..абсолютно ничего в консоль не выводит
расказывай, где компилишь, чем, какая ОСь, какая версия Qt ...
Этот пример будет железно везде работать если окружение нормальное.

Автор: Andrewshkovskii 2.1.2009, 1:46

Пробывал в eclipse и просто через qmake. В основном работаю в eclipse/minGw, ось -winXP, версия Qt 4.4.3. собирал :
-platform win32-g++ -fast -release -static. может из-за того, что собирал релизную версию, без дебага, по-этому в консоль и не выводит?
если надо, системные переменные :
PATH :
%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\storage\programming\MinGW\bin;C:\storage\programming\qt-win-opensource-src-4.4.3\bin;

Автор: Litkevich Yuriy 2.1.2009, 1:49

Цитата(Andrewshkovskii @ 2.1.2009, 4:46) *
-platform win32-g++ -fast -release -static.
здесь ключевое слово выделено жирно. Забудь в статике про картинки (кроме PNG пожалуй) - это известная бага!

Цитата(Andrewshkovskii @ 2.1.2009, 4:46) *
без дебага, по-этому в консоль и не выводит?
а консоль появляется? (по идее не должна)

Автор: Andrewshkovskii 2.1.2009, 1:50

Блин..просто тогда не удобно получается таскать либы вместе с exe файлом, если хочешь запустить на др. компе.а так они вшиваются в бинарник и..понятно вообще всем.

Автор: Litkevich Yuriy 2.1.2009, 1:52

Andrewshkovskii, говорят в 4.5 эту багу поправили. Но я не проверял.

Автор: Andrewshkovskii 2.1.2009, 1:53

понятно.ну мне и png хватит пока-что:)спасибо!

Автор: kuler 5.3.2009, 13:03

два вопроса:
есть QPainter, как с него изображение залить на qpixmap?
как перекопировать изображение с одного QPainter на другой?

Автор: kuler 5.3.2009, 14:40

чтоже такое то не работает?

QPixmap* pixmap = new QPixmap;
    QPainter *painter = new QPainter(pixmap);
    painter->begin(pixmap);
    painter->drawEllipse(100, 100, 100, 100);
    painter->end();
    ui.label->setPixmap(*pixmap);

Автор: SABROG 5.3.2009, 15:01

Я тоже пытался рисовать на QPixmap'e, но у меня при этом ничего не рисовалось, а в консоль писались ругательства про QPainter. Зато на QImage отлично рисуется.

Автор: BRE 5.3.2009, 15:01

Цитата(kuler @ 5.3.2009, 14:40) *
чтоже такое то не работает?
QPixmap* pixmap = new QPixmap ( [b]100, 100[/b] );
    QPainter *painter = new QPainter(pixmap);
    painter->begin(pixmap);
    painter->drawEllipse(100, 100, 100, 100);
    painter->end();
    ui.label->setPixmap(*pixmap);

Размер pixmap укажи.

Автор: kwisp 5.3.2009, 15:04

Цитата(SABROG @ 5.3.2009, 15:01) *
Я тоже пытался рисовать на QPixmap'e, но у меня при этом ничего не рисовалось, а в консоль писались ругательства про QPainter. Зато на QImage отлично рисуется.

да ну?
это что то недосомтрел наверное.
рисуется все прекрасно.

Автор: SABROG 5.3.2009, 15:05

Цитата(kwisp @ 5.3.2009, 15:04) *
Цитата(SABROG @ 5.3.2009, 15:01) *
Я тоже пытался рисовать на QPixmap'e, но у меня при этом ничего не рисовалось, а в консоль писались ругательства про QPainter. Зато на QImage отлично рисуется.

да ну?
это что то недосомтрел наверное.
рисуется все прекрасно.

Такое пишется

QPainter::begin: Paint device returned engine == 0, type: 2
QPainter::end: Painter not active, aborted

Автор: BRE 5.3.2009, 15:11

Цитата(SABROG @ 5.3.2009, 15:05) *
Цитата(kwisp @ 5.3.2009, 15:04) *
Цитата(SABROG @ 5.3.2009, 15:01) *
Я тоже пытался рисовать на QPixmap'e, но у меня при этом ничего не рисовалось, а в консоль писались ругательства про QPainter. Зато на QImage отлично рисуется.

да ну?
это что то недосомтрел наверное.
рисуется все прекрасно.

Такое пишется

QPainter::begin: Paint device returned engine == 0, type: 2
QPainter::end: Painter not active, aborted


Размер QPixmap указывал?

Автор: SABROG 5.3.2009, 15:23

Непомню.

Автор: kwisp 5.3.2009, 16:01

SABROG,
под виндой пробовал?
если есть желание можно пример состряпать.

Автор: SABROG 5.3.2009, 16:13

Цитата(kwisp @ 5.3.2009, 16:01) *
SABROG,
под виндой пробовал?
если есть желание можно пример состряпать.

Я сейчас ничего состряпать не могу, пытаюсь скомпилить QtCreator вместе с Qt из исходников, это на всю ночь.

Автор: BRE 5.3.2009, 17:31

#include <QApplication>
#include <QPainter>
#include <QPixmap>
#include <QDebug>

int main( int argc, char *argv[] )
{
        QApplication app( argc, argv );

        QPixmap pix( 100, 100 );
        QPainter p( &pix );
        p.fillRect( QRect( 0, 0, pix.size().width(), pix.size().height() ), QBrush( Qt::white ) );
        p.setPen( QPen( Qt::red ) );
        p.drawRect( 10, 10, 80, 80 );
        pix.save( "test.png" );

        return 0;
}

Автор: kuler 5.3.2009, 18:32

Цитата(Гость_BRE_* @ 5.3.2009, 17:31) *
QPainter p( &pix );

а можно это не в конструкторе сделать? что то типа p->setPixmap(pix)

Автор: BRE 5.3.2009, 18:36

Цитата(kuler @ 5.3.2009, 18:32) *
Цитата(Гость_BRE_* @ 5.3.2009, 17:31) *
QPainter p( &pix );

а можно это не в конструкторе сделать? что то типа p->setPixmap(pix)


p.begin( &pix );

Автор: kuler 5.3.2009, 19:00

остается один вопрос - как перекинуть с одного паинтера на другой данные

и как задать размеры пиксмапу не в конструкторе

Автор: BRE 5.3.2009, 19:02

Цитата(kuler @ 5.3.2009, 18:55) *
остается один вопрос - как перекинуть с одного паинтера на другой данные

Объект QPainter - это не хранилище данных, все данные храняться в объектах наследниках от QPaintDevice (QPixmap, QImage, QWidget, QPrinter и т.д.). Вот оттуда и нужно копировать.

Автор: kuler 5.3.2009, 19:41

а про размеры?

Автор: BRE 5.3.2009, 19:52

Цитата(kuler @ 5.3.2009, 19:41) *
а про размеры?

Эээ. Какие размеры?

Автор: kuler 5.3.2009, 19:56

как задать размеры пиксмапу не в конструкторе

Цитата(Гость_BRE_* @ 5.3.2009, 19:02) *
Вот оттуда и нужно копировать.

я хочу скопировать изображение qtablewidget на pixmap - как такое сделать?

Автор: BRE 5.3.2009, 20:00

Цитата(kuler @ 5.3.2009, 19:56) *
как задать размеры пиксмапу не в конструкторе

Цитата(Гость_BRE_* @ 5.3.2009, 19:02) *
Вот оттуда и нужно копировать.

я хочу скопировать изображение qtablewidget на pixmap - как такое сделать?


Цитата
QPixmap QPixmap::grabWidget ( QWidget * widget, const QRect & rectangle ) [static]

Автор: SABROG 5.3.2009, 21:59

Цитата(BRE @ 5.3.2009, 17:31) *
#include <QApplication>
#include <QPainter>
#include <QPixmap>
#include <QDebug>

int main( int argc, char *argv[] )
{
        QApplication app( argc, argv );

        QPixmap pix( 100, 100 );
        QPainter p( &pix );
        p.fillRect( QRect( 0, 0, pix.size().width(), pix.size().height() ), QBrush( Qt::white ) );
        p.setPen( QPen( Qt::red ) );
        p.drawRect( 10, 10, 80, 80 );
        pix.save( "test.png" );

        return 0;
}


Действительно так работает, а если сделать pixmap безразмерным, то как-раз получаю те самые ошибки. Спасибо.

Автор: kwisp 6.3.2009, 0:07

Цитата(SABROG @ 5.3.2009, 21:59) *
Действительно так работает, а если сделать pixmap безразмерным, то как-раз получаю те самые ошибки. Спасибо.


так и есть.
Цитата
QPixmap::QPixmap ()
Constructs a null pixmap.
See also isNull().
.....
bool QPixmap::isNull () const
Returns true if this is a null pixmap; otherwise returns false.
A null pixmap has zero width, zero height and no contents. You cannot draw in a null pixmap.

Автор: kuler 6.3.2009, 11:17

как задать размеры пиксмапу не в конструкторе

Автор: kwisp 6.3.2009, 11:23

Цитата(kuler @ 6.3.2009, 11:17) *
как задать размеры пиксмапу не в конструкторе

см.
Pixmap Transformations в Assistent

Автор: kuler 6.3.2009, 11:26

и почему когда в лэбел сую пиксмап, то его высота становится минимум сайз лабела?

Автор: kwisp 6.3.2009, 11:30

kuler,
а как тебе надо?
может дело в QLabel?

Автор: kuler 6.3.2009, 12:09

Цитата(kwisp @ 6.3.2009, 11:30) *
а как тебе надо?

чтобы размер лабела мог быть меньше размера пикса, так как на мониторе не помещается

Автор: kwisp 6.3.2009, 12:12

kuler,
так читай о QLabel

http://doc.crossplatform.ru/qt/4.4.3/qlabel.html#pixmap-prop
и проч. проч

Автор: kuler 6.3.2009, 12:42

kwisp, это я знаю, включал - выключал - не помогло

Автор: kwisp 6.3.2009, 12:48

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

Автор: kuler 6.3.2009, 13:17

Цитата(kwisp @ 6.3.2009, 12:48) *
тебе как надо чтобы размер пикс менялся вместе с размером лэйбла?

ну я думал это будет аутоматично за счет scaledcontents

Автор: kuler 6.3.2009, 14:44

c grab'ом чтото не получается не подскажите?

QPixmap pix(300, 300);
    pix.grabWidget(table);//, 0, 0, 200, 200);//пробовала и так и так
    m_Painter.begin(m_Pixmap);
    m_Painter.drawPixmap(0, 0, pix);
    m_Painter.end();

Автор: kwisp 6.3.2009, 14:47

Цитата(kuler @ 6.3.2009, 14:44) *
c grab'ом чтото не получается не подскажите?

а что не получается?
по конкретнее.
зачем с одной картинки на другую перерисовывать?

Автор: BRE 6.3.2009, 14:47

Цитата(kuler @ 6.3.2009, 14:44) *
c grab'ом чтото не получается не подскажите?
QPixmap pix(300, 300);
    pix.grabWidget(table);//, 0, 0, 200, 200);//пробовала и так и так
    m_Painter.begin(m_Pixmap);
    m_Painter.drawPixmap(0, 0, pix);
    m_Painter.end();

QPixmap pix = QPixmap::grabWidget( table );


Цитата
Warning: Do not call this function from QWidget::paintEvent().

Автор: kuler 10.3.2009, 11:56

а вот почему при вставке пиксмапа в лэбел при некоторых изменениях размера цвет фона становится синим? а так белый и мне кажется это правильно

Автор: kuler 10.3.2009, 14:37

Цитата(kwisp @ 6.3.2009, 11:23) *
Цитата(kuler @ 6.3.2009, 11:17) *
как задать размеры пиксмапу не в конструкторе

см.
Pixmap Transformations в Assistent

а как правильно?
так:
m_Pixmap = new QPixmap(1, 1);

m_Pixmap = m_Pixmap->scaled(100, 100,  Qt::KeepAspectRatio);

или так:
m_Pixmap = new QPixmap(1, 1);

tmp = Pixmap;
m_Pixmap = m_Pixmap->scaled(100, 100,  Qt::KeepAspectRatio);
delete tmp;

Автор: BRE 10.3.2009, 14:46

QPixmap pix1( ... );

QPixmap pix2 = pix1.scaled(...);

Автор: kuler 10.3.2009, 14:56

блин,чо они так тупо сделали - с указателями работать нельзя

Автор: kwisp 10.3.2009, 14:59

Цитата(kuler @ 10.3.2009, 14:56) *
блин,чо они так тупо сделали - с указателями работать нельзя

да все норм.
зачем тебе указатели?
пользуйся объектами и норм этож не виджет.

Автор: kuler 10.3.2009, 15:04

кроме того нельзя сделать scaled нулевого пиксмапа

Цитата(kwisp @ 10.3.2009, 14:59) *
зачем тебе указатели?

чтобы создавать объект когда захочу, чтобы расшаривать объект

Автор: BRE 10.3.2009, 15:07

Цитата(kuler @ 10.3.2009, 15:00) *
кроме того нельзя сделать scaled нулевого пиксмапа

А зачем это делать?
QPixmap p( 0, 0 );
p.scaled( 100, 100 );

тоже что и

QPixmap p( 100, 100 );



Цитата(kuler @ 10.3.2009, 15:04) *
кроме того нельзя сделать scaled нулевого пиксмапа

Цитата(kwisp @ 10.3.2009, 14:59) *
зачем тебе указатели?

чтобы создавать объект когда захочу, чтобы расшаривать объект


QPixmap dst = pix1.scaled( 100, 100 );

QPixmap *pPix = new QPixmap( dst );

или просто

QPixmap *pPix = new QPixmap( pix1.scaled( 100, 100 ) );

Автор: kuler 10.3.2009, 15:25

Цитата(BRE @ 10.3.2009, 15:07) *
А зачем это делать?

QPixmap p( 0, 0 );
p.scaled( 100, 100 );

тоже что и

QPixmap p( 100, 100 );

а ты проверял этот код? у меня такое не катит

Автор: kwisp 10.3.2009, 15:27

kuler,
это код не будет работать можно и не проверять. вернее первая его часть.
тебя просто спросили о смысле изменять размер нулевого пиксмапа?

Автор: kuler 10.3.2009, 15:32

kwisp, в конструкторе я хотел никак не инициализировать, ибо я не знаю какой размер мне нужен будет,а в последствии его узнав я хотел выставить. Конкретно мне надо добавлять страницы, я делаю превью печать, соответственно сначала 1 страница, в какойто момент их 2 и мне нужно расширить пиксмап

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)