Название: Использование маски
Отправлено: 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);
|