Russian Qt Forum
Октябрь 01, 2024, 02:38 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Использование маски  (Прочитано 5370 раз)
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
Записан
Sahab
Гость
« Ответ #1 : Сентябрь 12, 2010, 00:31 »

Цитировать
Компилятор KDevelop 1.3, Qt: 2.2
Непонимающий
Записан
ammaximus
Гость
« Ответ #2 : Сентябрь 12, 2010, 08:49 »

 Смеющийся
Неужто уже никто не помнит этой среды? Она вышла всего 10 лет назад.

Нет, серьезно, не думаю что ошибка связана с версией библиотеки. Что то в paintEvent я делаю не так, что?
Записан
BRE
Гость
« Ответ #3 : Сентябрь 12, 2010, 08:52 »

А зачем ты объект QPainter создаешь в конструкторе?
Создавай его непосредственно в painrEvent.
Записан
BRE
Гость
« Ответ #4 : Сентябрь 12, 2010, 08:59 »

Неужто уже никто не помнит этой среды? Она вышла всего 10 лет назад.
А если не секрет, чем обусловлен выбор Qt 2.2, при условии скорого выхода 4.7?  Улыбающийся
Да и среда сильно не нова.  Улыбающийся
Записан
merke
Гость
« Ответ #5 : Сентябрь 12, 2010, 09:15 »

Любовь к раритету=)) Смеющийся
Записан
ammaximus
Гость
« Ответ #6 : Сентябрь 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()));

}
Записан
Sancho_s_rancho
Гость
« Ответ #7 : Сентябрь 18, 2010, 09:54 »

У вас на каждое событие рисования создается экземпляр класс QPainter и не удаляется. Обычно на стеке его создают.
ПИ.СИ. Что-то сегодня как Мастер-Йода я тексты пишу.
Записан
ammaximus
Гость
« Ответ #8 : Сентябрь 19, 2010, 12:35 »

покажи
Записан
Sancho_s_rancho
Гость
« Ответ #9 : Сентябрь 25, 2010, 13:53 »

покажи
painter = new QPainter(this);
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.049 секунд. Запросов: 20.