Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вставка изображения на QWidget
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt GUI
Страницы: 1, 2
Andrewshkovskii
Не пойму, каким методом?
Например, есть у меня объект класса QWidget и QImage.
Создаю объект QImage :
QImage MyImage = new QImage("newyear09.gif","GIF");

как мне разместить это изображение на виджете?
fsMark
На каком виджите ты хочешь размешать изображение? В общем случае его можно просто нарисовать на виджите, смотри методы отрисовки виджетов...
Andrewshkovskii
да я попробовал следующие :
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
и не должно быть.
ты должен выполнять этот код:
drawImage(0,0,*MyImage);
В событии виджета paintEvent(...).
Есть вариант попроще: размести на виджете QLabel и засунь в QLabel пиксмап.
Andrewshkovskii
то есть нету простого способа создать виджет с изображением вставленным?..
Litkevich Yuriy
Цитата(Andrewshkovskii @ 1.1.2009, 21:27) *
то есть нету простого способа создать виджет с изображением вставленным?..
виджет для изображений - QLabel
изображение устанавливается методами:
setPixmap ( const QPixmap & )
setPicture(const QPicture & picture)

например:
#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
Хм..странно, но метка просто-напросто не показывается..
Litkevich Yuriy
Цитата(Andrewshkovskii @ 2.1.2009, 2:56) *
Хм..странно, но метка просто-напросто не показывается..
значит файла newyear09.gif нет в каталоге с бинарем. Проверь.
Andrewshkovskii
да я проверял, и так и сяк...пишу вот так вот :
#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
вот тестовый пример:
Нажмите для просмотра прикрепленного файла
скомпиль (qmake && make) и запусти отладочную версию ./build/tstd.exe
посмотри, что пишет в консоль.

затем в каталог ./build закинь файл av-64.gif и опять запусти отладочную версию ./build/tstd.exe
Andrewshkovskii
мда..абсолютно ничего в консоль не выводит.так же не появляется метка с изображением..
Litkevich Yuriy
Цитата(Andrewshkovskii @ 2.1.2009, 4:24) *
мда..абсолютно ничего в консоль не выводит
расказывай, где компилишь, чем, какая ОСь, какая версия Qt ...
Этот пример будет железно везде работать если окружение нормальное.
Andrewshkovskii
Пробывал в 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
Цитата(Andrewshkovskii @ 2.1.2009, 4:46) *
-platform win32-g++ -fast -release -static.
здесь ключевое слово выделено жирно. Забудь в статике про картинки (кроме PNG пожалуй) - это известная бага!

Цитата(Andrewshkovskii @ 2.1.2009, 4:46) *
без дебага, по-этому в консоль и не выводит?
а консоль появляется? (по идее не должна)
Andrewshkovskii
Блин..просто тогда не удобно получается таскать либы вместе с exe файлом, если хочешь запустить на др. компе.а так они вшиваются в бинарник и..понятно вообще всем.
Litkevich Yuriy
Andrewshkovskii, говорят в 4.5 эту багу поправили. Но я не проверял.
Andrewshkovskii
понятно.ну мне и png хватит пока-что:)спасибо!
kuler
два вопроса:
есть QPainter, как с него изображение залить на qpixmap?
как перекопировать изображение с одного QPainter на другой?
kuler
чтоже такое то не работает?
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
Я тоже пытался рисовать на QPixmap'e, но у меня при этом ничего не рисовалось, а в консоль писались ругательства про QPainter. Зато на QImage отлично рисуется.
BRE
Цитата(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
Цитата(SABROG @ 5.3.2009, 15:01) *
Я тоже пытался рисовать на QPixmap'e, но у меня при этом ничего не рисовалось, а в консоль писались ругательства про QPainter. Зато на QImage отлично рисуется.

да ну?
это что то недосомтрел наверное.
рисуется все прекрасно.
SABROG
Цитата(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
Цитата(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
Непомню.
kwisp
SABROG,
под виндой пробовал?
если есть желание можно пример состряпать.
SABROG
Цитата(kwisp @ 5.3.2009, 16:01) *
SABROG,
под виндой пробовал?
если есть желание можно пример состряпать.

Я сейчас ничего состряпать не могу, пытаюсь скомпилить QtCreator вместе с Qt из исходников, это на всю ночь.
BRE
#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
Цитата(Гость_BRE_* @ 5.3.2009, 17:31) *
QPainter p( &pix );

а можно это не в конструкторе сделать? что то типа p->setPixmap(pix)
BRE
Цитата(kuler @ 5.3.2009, 18:32) *
Цитата(Гость_BRE_* @ 5.3.2009, 17:31) *
QPainter p( &pix );

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


p.begin( &pix );
kuler
остается один вопрос - как перекинуть с одного паинтера на другой данные

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

Объект QPainter - это не хранилище данных, все данные храняться в объектах наследниках от QPaintDevice (QPixmap, QImage, QWidget, QPrinter и т.д.). Вот оттуда и нужно копировать.
kuler
а про размеры?
BRE
Цитата(kuler @ 5.3.2009, 19:41) *
а про размеры?

Эээ. Какие размеры?
kuler
как задать размеры пиксмапу не в конструкторе

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

я хочу скопировать изображение qtablewidget на pixmap - как такое сделать?
BRE
Цитата(kuler @ 5.3.2009, 19:56) *
как задать размеры пиксмапу не в конструкторе

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

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


Цитата
QPixmap QPixmap::grabWidget ( QWidget * widget, const QRect & rectangle ) [static]
SABROG
Цитата(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
Цитата(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
как задать размеры пиксмапу не в конструкторе
kwisp
Цитата(kuler @ 6.3.2009, 11:17) *
как задать размеры пиксмапу не в конструкторе

см.
Pixmap Transformations в Assistent
kuler
и почему когда в лэбел сую пиксмап, то его высота становится минимум сайз лабела?
kwisp
kuler,
а как тебе надо?
может дело в QLabel?
kuler
Цитата(kwisp @ 6.3.2009, 11:30) *
а как тебе надо?

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

scaledContecst
и проч. проч
kuler
kwisp, это я знаю, включал - выключал - не помогло
kwisp
kuler,
тогда такой вопрос.
тебе как надо чтобы размер пикс менялся вместе с размером лэйбла?
тогда я думаю либо перерисовывать либо в resizeEvent() делать scale() пиксу и вставлять его заново.
можно палитры еще использовать.
kuler
Цитата(kwisp @ 6.3.2009, 12:48) *
тебе как надо чтобы размер пикс менялся вместе с размером лэйбла?

ну я думал это будет аутоматично за счет scaledcontents
kuler
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
Цитата(kuler @ 6.3.2009, 14:44) *
c grab'ом чтото не получается не подскажите?

а что не получается?
по конкретнее.
зачем с одной картинки на другую перерисовывать?
BRE
Цитата(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().
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2020 IPS, Inc.