Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: ammaximus от Сентябрь 11, 2010, 23:49



Название: Использование маски
Отправлено: ammaximus от Сентябрь 11, 2010, 23:49
Создаю виджет, в котором рисуется фон, а затем сверху накладывается движущееся изображение, ограниченное маской. Проблема в том, что при перерисовке, облать маски принимает вид области перерисовки и так остается (попробуйте кликнуть в центр на стрелку).
Код:
#include "iko.h"
#include "math.h"

//---------------------------------------------------- лПОУФТХЛФПТ------------/** 1A **/

clock::clock(QWidget* parent=0, QString pathName="./"){

  currentSpeed   =  60;
  cSectorNumber  =  999;
  cSectorSmall   =  360.0 / (cSectorNumber+1);

//----------------------------------------------------йОЙГЙБМЙЪБГЙС----------/**/

  currentSector = 0;
    angle = 0;
    xR = 193;
    yR = 193;
    centerX = 260;    // 260
    centerY = 260;    // 260

    colorSecond    =    qRgba(0,0,0xFF,0xFF);
    colorBack    =    qRgba(0,0,0,0);

    roundTimer = new QTimer(this);
    connect(roundTimer, SIGNAL(timeout()),this, SLOT(stepUp()));
    roundTimer->start(currentSpeed,false);

//-----------------------------------------------------пФТЙУПЧЛБ ЖПОБ--------/**/

    setGeometry(0, 0, 520, 520);
     setFixedSize(520,520);
    QPixmap pm(pathName+QString("main.png"));

    if (pm.size()!=this->size()){
        QWMatrix m;
        m.scale((double)width()/pm.width(), (double)height()/pm.height());
        pm = pm.xForm(m);
  }
    mainMap = pm;
//-------------------------------------------------------рБТБНЕФТЩ НБУЛЙ---------//**//
    QBitmap mask(520,520, false, QPixmap::DefaultOptim);
    mask.fill(color1);
  painter = new QPainter(&mask);
  painter->setPen(color0);
    painter->setBrush(color0);
    painter->drawEllipse(60,60,400,400);
    painter->end();

    painter = new QPainter(this);

    painter->setPen(QPen(colorSecond, 1, SolidLine));
    pX = (xR * cos(-M_PI/2) ) + centerX;
    pY = (yR * sin(-M_PI/2) ) + centerY;


}

//-----------------------------------------------------//
void clock::paintEvent(QPaintEvent *event){
    painter->setClipping(false);
    painter->drawPixmap(0, 0, mainMap);

  QRegion region(60,60,400,400, QRegion::Ellipse);
    painter->setClipRegion(region);
  painter->setClipping(true);
//    painter->drawPie( QRect(60, 60, 400, 400), angle, 3);
   
}
//---------------------------------------------------//

void clock::clearLast(){
// ------------------------------------------------------ уФЙТБЕН РТПЫМПЕ --//
 painter -> setBrush(Qt::black);
 painter->setPen(QPen(black, 1, SolidLine));
 painter->drawLine(centerX, centerY, pX, pY);

}


//-----------------------------------------------------------  STEP UP ------//
void clock::stepUp(){
 if(currentSector == cSectorNumber) currentSector = 0;
 else currentSector++;

 angle = ((currentSector * cSectorSmall -90) * M_PI)/180;
 clearLast();

//-------------------------------------------------------- рЕТЕУЮЕФ ЛППТДЙОБФ УФТЕМЛЙ -----//

 pX = (xR * cos(angle)) + centerX;
 pY = (yR * sin(angle)) + centerY;

//---------------------------------------------------- мЙОЙС УФТЕМЛЙ ----------------------//
 painter->setPen(QPen(colorSecond, 1, SolidLine));
 painter->drawLine(centerX, centerY, pX, pY);

}



void clock::mousePressEvent( QMouseEvent* e){

    QMessageBox::information(this, " ", QString::number(e->x())+" "+QString::number(e->y()));

}

Код:
#ifndef CLOCK_H
#define CLOCK_H

#include <qwidget.h>
#include <qtimer.h>
#include <qpixmap.h>
#include <qbitmap.h>
#include <qpainter.h>
#include <qmsgbox.h>
#include <stdio.h>
#include <fstream.h>

class clock : public QWidget{
Q_OBJECT

  QPixmap mainMap;            // жПОПЧПЕ ЙЪПВТБЦЕОЙЕ (ЖПФПЗТБЖЙС)

    QTimer *roundTimer;         // чТБЭБАЭЙК ФБКНЕТ
    int currentSpeed;           // уЛПТПУФШ ЧТБЭЕОЙС
    int currentSector;          // оБРТБЧМЕОЙЕ УФТЕМЛЙ (УЕЛФПТ)
    QPainter *painter;          // иХДПЦОЙЛ

    int pX;                     // рПЪЙГЙС ЛПОГБ УФТЕМЛЙ
    int pY;                     //------------------//
    int centerX;                                // рПЪЙГЙС ОБЮБМБ УФТЕМЛЙ
    int centerY;                //------------------//

    int xR;                     // дМЙОБ УФТЕМЛЙ РП и
    int yR;                     // дМЙОБ УФТЕМЛЙ РП х

    float angle;                // оБРТБЧМЕОЙЕ УФТЕМЛЙ (ХЗПМ)

//--------------------------------------------------------------- гЧЕФБ ----//

    QRgb colorBack;                              // гЧЕФ ЖПОБ
    QRgb colorSecond;                            // гЧЕФ УФТЕМЛЙ


    int cSectorNumber;            // лПМЙЮЕУФЧП ХЮБУФЛПЧ, ОБ ЛПФПТЩЕ ДЕМЙФУС ЛТХЗ
    float cSectorSmall;           // тБЪНЕТ ФБЛПЗП ХЮБУФЛБ

public:

  clock(QWidget* parent=0, QString pathName="./");

  void clearLast();

////////////////////////////////////
protected:
  void mousePressEvent( QMouseEvent* );

  void paintEvent(QPaintEvent *event);

public slots:

    void stepUp();               // пЮЕТЕДОПК ФЙЛ

};

#endif

В чем проблема?

Компилятор KDevelop 1.3, Qt: 2.2


Название: Re: Использование маски
Отправлено: Sahab от Сентябрь 12, 2010, 00:31
Цитировать
Компилятор KDevelop 1.3, Qt: 2.2
???


Название: Re: Использование маски
Отправлено: ammaximus от Сентябрь 12, 2010, 08:49
 ;D
Неужто уже никто не помнит этой среды? Она вышла всего 10 лет назад.

Нет, серьезно, не думаю что ошибка связана с версией библиотеки. Что то в paintEvent я делаю не так, что?


Название: Re: Использование маски
Отправлено: BRE от Сентябрь 12, 2010, 08:52
А зачем ты объект QPainter создаешь в конструкторе?
Создавай его непосредственно в painrEvent.


Название: Re: Использование маски
Отправлено: BRE от Сентябрь 12, 2010, 08:59
Неужто уже никто не помнит этой среды? Она вышла всего 10 лет назад.
А если не секрет, чем обусловлен выбор Qt 2.2, при условии скорого выхода 4.7?  :)
Да и среда сильно не нова.  :)


Название: Re: Использование маски
Отправлено: merke от Сентябрь 12, 2010, 09:15
Любовь к раритету=)) ;D


Название: Re: Использование маски
Отправлено: ammaximus от Сентябрь 18, 2010, 03:24
Работаем со старым оборудованием, куда деваться. Уже должно радовать что не напрямую.

Попробовал сделать в QT 4.6, работает. Посмотрим как перенесется.

Кстати я так и не врубился как работать с painter. Код ниже выдает painter alredy active.

Код:
test::test(){
    pos = 0;
}

void test::paintEvent(QPaintEvent *event){
   painter = new QPainter(this);
   QRegion region(60,60,400,400, QRegion::Ellipse);
   painter->setClipRegion(region);
   painter->setClipping(true);
   painter->begin(this);
   painter->drawLine(0+pos,0+pos,450-pos,340-pos);
   painter->end();
   if (pos>430) pos=0;
   else pos+=10;
}
void test::mousePressEvent( QMouseEvent* e){

QMessageBox::information(this, " ", QString::number(e->x())+" "+QString::number(e->y()));

}


Название: Re: Использование маски
Отправлено: Sancho_s_rancho от Сентябрь 18, 2010, 09:54
У вас на каждое событие рисования создается экземпляр класс QPainter и не удаляется. Обычно на стеке его создают.
ПИ.СИ. Что-то сегодня как Мастер-Йода я тексты пишу.


Название: Re: Использование маски
Отправлено: ammaximus от Сентябрь 19, 2010, 12:35
покажи


Название: Re: Использование маски
Отправлено: Sancho_s_rancho от Сентябрь 25, 2010, 13:53
покажи
painter = new QPainter(this);