URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 1632
[ Назад ]

Исходное сообщение
"Как сграбить содержимое QWidget?"

Отправлено vshekun , 23-Апр-03 16:04 
Сабж. Пытаюсь grabWidget'ом, что в в QPixmap, но ничего не получается. :(

пишу что-то типа:

widget -- указатель на родительский класс QWidget,на кот. я рисую свой класс QWidget.

QPixmap pixmap;
pixmap.grabWidget( widget );

Код компилируется,но процесс завершается с ошибками. :((

Ничего более подходящего не нашел. Подсобите советом.


Содержание

Сообщения в этом обсуждении
"Как сграбить содержимое QWidget?"
Отправлено XMan , 23-Апр-03 19:41 
А что делает:

QPixmap pixmap=QPixmap::grabWidget(widget);

?

PS. grabWidget - статический метод


"Как сграбить содержимое QWidget?"
Отправлено vshekun , 28-Апр-03 14:36 
>А что делает:
>QPixmap pixmap=QPixmap::grabWidget(widget);
>?
>PS. grabWidget - статический метод

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

QPixmap::grabWidget(this)

, то будет ругаться. :-( Мне надо грабить виджет целиком. Из потомков.


"Как сграбить содержимое QWidget?"
Отправлено vshekun , 28-Апр-03 15:16 
>А что делает:
>QPixmap pixmap=QPixmap::grabWidget(widget);
>?
>PS. grabWidget - статический метод


  Я немного пурги нагнал в прошлом сообщении. Эта ф-я почему-то вылетает с ошибкой когда пытаешься сграбить из конструктора. Т.е. если я bg вызову из конструктора, то он матюгается, если после выполнения конструктора, то грабит. ВНИМАНИЕ ВОПРОС: Как сграбить виджет БЕЗ хх. Т.е. его вид до создания класса xx. Грабить надо из xx.

class xx : public QWidget
{
    QWidget *widget;
    .
    .
    .
}

xx::xx (QWidget *parent) : QWidget(parent)
{
    widget = parent;
    .
    .
    .
}

void xx:bg()
{
    QPixmap mp = QPixmap::grabWidget(widget);
}


"Как сграбить содержимое QWidget?"
Отправлено XMan , 28-Апр-03 21:30 
А как ты собираешься грабить виджет, если он еще не нарисован ? А рисуется он не в конструкторе, а при вызове метода show :)

А сграбить без xx можно при помощи замены xx на parent в любом месте методов класса :)


"Как сграбить содержимое QWidget?"
Отправлено vshekun , 30-Апр-03 10:51 
>А как ты собираешься грабить виджет, если он еще не нарисован ?
>А рисуется он не в конструкторе, а при вызове метода show
>:)
>
>А сграбить без xx можно при помощи замены xx на parent в
>любом месте методов класса :)


Черт! А вот слона-то я и не заметил. Спасибо.


"Как сграбить содержимое QWidget?"
Отправлено vshekun , 05-Май-03 13:49 
>А как ты собираешься грабить виджет, если он еще не нарисован ?
>А рисуется он не в конструкторе, а при вызове метода show
>:)

   Прорисовал:

class VCiferblat : public QWidget, public PThread {
.
.
.
}

class ImageItem: public QCanvasRectangle
{
public:
    ImageItem( QImage img, QCanvas *canvas );
     QPixmap getPixmap();
protected:
    void drawShape( QPainter & );
private:
    QImage image;
    QPixmap pixmap;
};


ImageItem::ImageItem( QImage img, QCanvas *canvas )
    : QCanvasRectangle( canvas ), image(img)
{
    setSize( image.width(), image.height() );

#ifndef _WS_QWS_
    pixmap.convertFromImage(image, OrderedAlphaDither);
#endif
}

QPixmap ImageItem::getPixmap()
{
#ifdef _WS_QWS_
    return( image->convertFromImage() );
#else
    return( pixmap );
#endif
}

void ImageItem::drawShape( QPainter &p )
{
#ifdef _WS_QWS_
    p.drawImage( int(x()), int(y()), image, 0, 0, -1, -1, OrderedAlphaDither );
#else
    p.drawPixmap( int(x()), int(y()), pixmap );
#endif
}

VCiferblat::VCiferblat(QWidget *parent, const char *name) : QWidget(parent, name)
{
   .
   .
   .
   widget        = parent;
   .
   .
   .
   resize(0,0);
   canvasLine    = new QCanvasLine(canvas);
   canvasLine->setZ(250);
   .
   .
   .
   canvasView = new QCanvasView(canvas, widget);
   canvasView->setBackgroundMode( NoBackground );
   canvasView->setVScrollBarMode(QCanvasView::AlwaysOff);
   canvasView->setHScrollBarMode(QCanvasView::AlwaysOff);
   canvasView->setGeometry(x-Radius,y-Radius, Radius*2, Radius*2);
   canvasView->setFrameShape( QFrame::NoFrame );
   .
   .
   .
   canvas->update();
   .
   .
   .
   QPixmap mp;
   widget->show();
   canvasView->hide();
   sleep(10);
   mp=QPixmap::grabWidget(widget, x-Radius, y-Radius, Radius*2, Radius*2);
   cerr << "mp" << &mp <<endl;
}

====

BezierTest::BezierTest( QWidget* parent,  const char* name, bool modal, WFlags fl )
    : QDialog( parent, name, modal, fl )
{
    .
    .
    .
    m1 = new VCiferblat (this, "1");
    .
    .
    .
}

   Виджет вижу.. Эффект тот же.. :((

>А сграбить без xx можно при помощи замены xx на parent в
>любом месте методов класса :)

   Хм.. Не подумал. :)


"Как сграбить содержимое QWidget?"
Отправлено XMan , 05-Май-03 14:56 
Ты код заслать можешь на _xman_@mail.ru ? Я посмотрю как это выглядит.
У меня есть такой класс:

class EWidgetManipulatorClass : public QWidget
{
...
    void grab();
...
    QWidget *GrabWidget;
...
};

и реализация метода:

void EWidgetManipulatorClass::grab()
{
    if (GrabWidget) setBackgroundPixmap(QPixmap::grabWidget(GrabWidget));
}

Всё работает :)