Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите с рисованием в QPixmap
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Система рисования. Печать
tutta
Ребята! Очень нужна ваша помощь. с QT Знакома плохо, только начинаю. Задача в том чтобы написать рисование карандашом в qt. Я это сделала с помощью Pixmap. Но проблема в том, что на главное окошко нельзя добавлять кнопки, там только этот Pixmap. Помогите, как исправить код, чтобы Pixmap был не в главном окошке а на каком то виджете, чтобы была возможность добавлять кнопки и другие виджеты


 
#include <QApplication>
#include <QPainter>
#include <QImage>
#include <QMouseEvent>
#include <QPaintEvent>
#include <QWidget>


class Paint : public QWidget
{

public:
    Paint()
    {
        pixmap_ = QPixmap( 4096, 4096 );
        pixmap_.fill( 0xffffffff);
        pen_ = QPen( QBrush( Qt::green), 5.0f );
    }

protected:
    void mousePressEvent( QMouseEvent * e )
    {
        if ( e->button() == Qt::LeftButton )
        {
            QPainter p( &pixmap_ );
            p.setPen( pen_ );
            p.drawPoint( e->pos() );
            p.end();

            lastPoint_ = e->pos();

            update();
        }
    }

    void mouseMoveEvent( QMouseEvent * e )
    {
        if ( e->buttons() & Qt::LeftButton )
        {
            QPainter p( &pixmap_ );
            p.setPen( pen_ );
            p.drawLine( lastPoint_, e->pos() );
            p.end();

            lastPoint_ = e->pos();

            update();
        }
    }

    void paintEvent( QPaintEvent * )
    {
        QPainter p( this );
        p.setCompositionMode( QPainter::CompositionMode_Source );
        p.drawPixmap( QPoint(), pixmap_ );
    }

private:
    QPen pen_;
    QPixmap pixmap_;
    QPoint lastPoint_;
};




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

    Paint point;
    point.show();
    

    return app.exec();
}
DmP
Посмотри для примера описание класса QVBoxLayout, возможно поможет.
SABROG
Цитата(DmP @ 16.5.2009, 17:52) *
Посмотри для примера описание класса QVBoxLayout, возможно поможет.

Врятли :) Кому интересно я ей на другом форуме ответил: http://forum.vingrad.ru/forum/topic-259502.html
Litkevich Yuriy
Лучше всё таки рисовать на одном виджете, а его разместить на выше стоящем.
Начать изучение этого дела, нужно хотябы с Урока 4 - Используйте виджеты (а лучше конечно с первого)
Гость
завел в ассистант на диалоге вджет и сделал в ассистант промоте на Zkarta с одной только функцией

тормоза:
 void Zkarta::paintEvent(QPaintEvent *event)
{   static int e;
     if(++e<22)
         return;
     printf(" %d ",e++);

     QPainter p(this);
     QRect r=p.viewport ();
     for(int y=r.top();y<=r.bottom();y++)
     for(int x=r.left();x<=r.right();x++)
     {  p.setPen ( QColor(255*(y-r.bottom())/(r.top()-r.bottom()),255*(x-r.left())/(r.right()-r.left()),0));
         p.drawPoint(x,y);
     }
     p.end();
};



При открытии приход 2 раза стеки ( первый короткий )
Раскрывающийся текст
0    Zkarta::paintEvent    main.cpp    60    
1    QWidget::event    qwidget.cpp    7687    
2    QApplicationPrivate::notify_helper    qapplication.cpp    4056    
3    QApplication::notify    qapplication.cpp    4021    
4    QCoreApplication::notifyInternal    qcoreapplication.cpp    610    
5    QCoreApplication::sendSpontaneousEvent    qcoreapplication.h    216    
6    QWidgetPrivate::drawWidget    qwidget.cpp    5079    
7    QWidgetPrivate::paintSiblingsRecursive    qwidget.cpp    5189    
8    QWidgetPrivate::drawWidget    qwidget.cpp    5124    
9    QWidgetBackingStore::sync    qbackingstore.cpp    1261    
10    QWidgetBackingStore::sync    qbackingstore.cpp    1074    <==
11    QWidgetPrivate::syncBackingStore    qwidget.cpp    1612    
12    QETWidget::translatePaintEvent    qapplication_win.cpp    3635    
13    QtWndProc    qapplication_win.cpp    2031    
14    USER32!GetDC    C:\WINDOWS\system32\user32.dll    0    
15    ??        0    
16    ??        0    
17    ??        0    


0    Zkarta::paintEvent    main.cpp    60    
1    QWidget::event    qwidget.cpp    7687    
2    QApplicationPrivate::notify_helper    qapplication.cpp    4056    
3    QApplication::notify    qapplication.cpp    4021    
4    QCoreApplication::notifyInternal    qcoreapplication.cpp    610    
5    QCoreApplication::sendSpontaneousEvent    qcoreapplication.h    216    
6    QWidgetPrivate::drawWidget    qwidget.cpp    5079    
7    QWidgetPrivate::paintSiblingsRecursive    qwidget.cpp    5189    
8    QWidgetPrivate::drawWidget    qwidget.cpp    5124    
9    QWidgetBackingStore::sync    qbackingstore.cpp    1261    
10    QWidgetPrivate::syncBackingStore    qwidget.cpp    1603     <==    
11    QWidget::event    qwidget.cpp    7827    
12    QApplicationPrivate::notify_helper    qapplication.cpp    4056    
13    QApplication::notify    qapplication.cpp    4021    
14    QCoreApplication::notifyInternal    qcoreapplication.cpp    610    
15    QCoreApplication::sendEvent    qcoreapplication.h    213    
16    QCoreApplicationPrivate::sendPostedEvents    qcoreapplication.cpp    1247    
17    QEventDispatcherWin32::processEvents    qeventdispatcher_win.cpp    679    
18    QGuiEventDispatcherWin32::processEvents    qapplication_win.cpp    1182    
19    QEventLoop::processEvents    qeventloop.cpp    149    
20    QEventLoop::exec    qeventloop.cpp    201    
21    QCoreApplication::exec    qcoreapplication.cpp    888    
22    QApplication::exec    qapplication.cpp    3525    
23    main    main.cpp    79



Вот коды в местах вызовов
qbackingstore.cpp 1261
Раскрывающийся текст
#ifdef Q_BACKINGSTORE_SUBSURFACES

   чегото
#else
        QPoint offset(tlwOffset);
        if (w != tlw)
            offset += w->mapTo(tlw, QPoint());
        wd->drawWidget(windowSurface->paintDevice(), toBePainted, offset, flags, 0, this);
        //  это 1261
#endif
    }

    // Paint the rest with composition.
#ifndef Q_BACKINGSTORE_SUBSURFACES
    if (repaintAllWidgets || !dirtyCopy.isEmpty()) {
        const int flags = QWidgetPrivate::DrawAsRoot | QWidgetPrivate::DrawRecursive;
        tlw->d_func()->drawWidget(windowSurface->paintDevice(), dirtyCopy, tlwOffset, flags, 0, this);
       // и отсюда иногда зовется
    }

    endPaint(toClean, windowSurface, &beginPaintInfo);
#else
    чегото
#endif


widget.cpp 1603
Раскрывающийся текст
void QWidgetPrivate::syncBackingStore()
{
    if (paintOnScreen()) {
        repaint_sys(dirty);
        dirty = QRegion();
    } else if (QWidgetBackingStore *bs = maybeBackingStore()) {
        bs->sync();
    }
}


При перекратии другим окном тоже 2 QPaintEvent
WinXP красивости отключил, Qt последний, MinGW

Как от двойной перерисовки избавится?
Гость
А сам виджет
int main(int argc, char ** argv)
{
    QApplication app( argc, argv );

        Zkarta k(0);
        k.resize(66,99);
        k.show();

    return app.exec();
}

По одному разу рисует

ЗыЗы
Там в стеках различие значком <== помечено.
Гость
решил проблему - autoFillBackground взвел
Litkevich Yuriy
Цитата(Гость_Гость_* @ 13.8.2009, 20:09) *
завел в ассистант на диалоге вджет и сделал в ассистант промоте на
видимо речь шла о Дизайнере, а не Асистенте ?
Гость
Цитата(Litkevich Yuriy @ 13.8.2009, 18:52) *
видимо речь шла о Дизайнере, а не Асистенте ?

Да в дизайнере. Скорость тоже не супер и при однократном, но пока сойдет. RTFM потом на досуге почитаю
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.