예제 #1
0
void QLed::paintEvent(QPaintEvent *)
{
	QPainter painter(this);
	painter.setRenderHint(QPainter::Antialiasing, true);
	painter.setWindow( -50,-50,100,100);
	
	painter.setPen(Qt::white);
	painter.drawArc(-25,-25,50,50,0,5670);
	painter.drawArc(-32,-33,66,66,0,5670);
	painter.setPen(Qt::darkGray);
	painter.drawArc(-34,-33,66,66,3400,3000);
	
    if(m_value)
    {
      QRadialGradient radialGrad(QPointF(-8, -8), 20);
      radialGrad.setColorAt(0, Qt::white);
       
      radialGrad.setColorAt(1, m_color);
   	  QBrush brush(radialGrad);
      painter.setBrush(brush);
      painter.setPen(Qt::black);
	  painter.drawEllipse(-25,-25,50,50);
    }
    else
    {
      QRadialGradient radialGrad(QPointF(-8, -8), 20);
      radialGrad.setColorAt(0, Qt::white);
      radialGrad.setColorAt(1, Qt::lightGray);
   	  QBrush brush(radialGrad);
      painter.setBrush(brush);
	  painter.drawEllipse(-25,-25,50,50);
    }	
}
예제 #2
0
void LensItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
	Q_UNUSED(widget);
	painter->setPen(QPen(Qt::black, 1.0 / option->levelOfDetail));
	QRadialGradient radialGrad(QPointF(0.5, 0.5), 1.0);
	radialGrad.setColorAt(0.0, QColor(255, 0, 0, 127));
	radialGrad.setColorAt(0.1, QColor(255, 0, 0, 127));
	radialGrad.setColorAt(1.0, QColor(255, 255, 255, 0));
#if QT_VERSION  >= 0x040301
	radialGrad.setCoordinateMode(QGradient::ObjectBoundingMode);
#endif
	painter->setBrush(radialGrad);
	painter->drawEllipse(rect().toRect());
	if (option->state & QStyle::State_Selected)
	{
		scaling = option->levelOfDetail;
		double siz = 6.0 / option->levelOfDetail;
		QRectF br = boundingRect();
		painter->setBrush(Qt::NoBrush);
		painter->setPen(QPen(Qt::red, 1.0 / option->levelOfDetail, Qt::DotLine));
		painter->drawRect(br);
		painter->setBrush(Qt::red);
		painter->setPen(Qt::NoPen);
		painter->drawRect(QRectF(br.x() + br.width(), br.y() + br.height(), -siz, -siz));
		painter->drawRect(QRectF(br.x() + br.width(), br.y(), -siz, siz));
		painter->drawRect(QRectF(br.x(), br.y() + br.height(), siz, -siz));
		painter->drawRect(QRectF(br.x(), br.y(), siz, siz));
	}
}
예제 #3
0
ZLightingCoursor::ZLightingCoursor(QGraphicsScene* pScene, const QSize& size)
  :QGraphicsPixmapItem(), m_Size(size)
{

    QRadialGradient radialGrad(size.width()/2, size.height()/2, size.width());
  QColor col = Qt::darkBlue;
  col.setAlpha(127);

    radialGrad.setColorAt(0,col/* Qt::darkBlue*/);
    radialGrad.setColorAt(0.5,col/* Qt::darkBlue*/);
    radialGrad.setColorAt(1, Qt::transparent);
    QPixmap pixmap(size);
    pixmap.fill(Qt::transparent);
    QPainter painter(&pixmap);
    painter.setPen(Qt::NoPen);
    painter.setBrush(radialGrad);
    painter.drawEllipse(-2, -2, size.width()+4, size.height()+4);
    painter.end();

  setPixmap(pixmap);
    setZValue(2);

  pScene->addItem(this);

  hide();


    m_TimeLine.setDuration(150);
    m_TimeLine.setFrameRange(1, 150);
    m_TimeLine.setDirection(QTimeLine::Backward);

    connect(&m_TimeLine, SIGNAL(frameChanged(int)), this, SLOT(OnSetFrame(int)));
//    connect(&m_TimeLine, SIGNAL(finished()), this, SLOT(updateItemPosition()));

}
예제 #4
0
HandgripItem::HandgripItem(QObject *parentObject, QGraphicsItem *parentItem, int id, int type)
    : QObject(parentObject),
    QGraphicsPathItem(parentItem),
    m_opacityAnimation( new QPropertyAnimation(this, "opacity", this) ),
    m_moving(false),
    m_id(id),
    m_type(type)
{
    setAcceptHoverEvents(true);
    setFlag(QGraphicsItem::ItemIgnoresTransformations,true);

    QRadialGradient radialGrad(0,0,sizeMark,0,0);

    radialGrad.setColorAt( 0.0, QColor(200, 255, 255) );
    if (m_type == ROTATOR)
    {
        radialGrad.setColorAt( 0.0, QColor(255, 50, 0) );
        radialGrad.setColorAt( 1.0, QColor(255, 190, 0) );
    }
    else
    {
        radialGrad.setColorAt( 0.0, QColor(200, 255, 255) );
        radialGrad.setColorAt( 1.0, QColor(31, 197, 193) );
    }

    QBrush b(radialGrad);
    b.setStyle(Qt::RadialGradientPattern);

    QRectF r(0, 0, sizeMark, sizeMark);
    r.moveCenter( QPoint(0, 0) );
    QPainterPath p;
    p.addRoundedRect(r, cornerSize, cornerSize);

    setPath(p);
    setBrush(b);
    setPen( QPen(Qt::black) );

    QPen p2(Qt::red, 1);
    p2.setCosmetic(true);
    m_outerRing.setParentItem(this);
    m_outerRing.setRect( r.adjusted(-sizeMark / 2, -sizeMark / 2, sizeMark / 2, sizeMark / 2) );
    m_outerRing.setPen(p2 );
    m_outerRing.hide();

    // in order to
    connect( m_opacityAnimation,SIGNAL( finished () ),this,SLOT( checkVisibility() ) );

    // select a correct cursor from type
    if (m_type == TRANSLATOR_XY)
        QGraphicsItem::setCursor( QCursor(Qt::SizeAllCursor ) );
    else if (m_type == TRANSLATOR_Y)
        QGraphicsItem::setCursor( QCursor(Qt::SizeVerCursor ) );
    else if (m_type == TRANSLATOR_X)
        QGraphicsItem::setCursor( QCursor(Qt::SizeHorCursor ) );
    else
        QGraphicsItem::setCursor( QCursor( QPixmap(":/editor/editor/cursor_rotate.png") ) );
}
예제 #5
0
// Draw background pixmap separately, only updated after resize event and when
// m_LimitReached state is changed
void AnalogPad::paintBackground()
{
    m_BackgroundPixmap = QPixmap(this->size());
    m_BackgroundPixmap.fill(Qt::transparent);

    QPainter painter(&m_BackgroundPixmap);
    painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing | QPainter::HighQualityAntialiasing);

    painter.setPen(m_BackgroundColor2);
    // Draw widget borders
    //painter.drawRect(this->rect().adjusted(0, 0, -1, -1));

    // Draw pad
    // Outer circle..
    QRadialGradient radialGrad(QPointF(m_Position.x(), m_Position.y()), this->height()*0.7, QPointF(this->width()*0.1,this->height()*0.1));
    const int BRIGHTNESS = 95;
    radialGrad.setColorAt(0, m_BackgroundColor1.lighter(BRIGHTNESS));
    radialGrad.setColorAt(1, m_BackgroundColor2.lighter(BRIGHTNESS));
    painter.setBrush(QBrush(radialGrad));
    painter.drawEllipse(m_Position, this->width()*0.45, this->height()*0.45);
    
    // ..and inner circle
    radialGrad.setColorAt(0, m_BackgroundColor1);
    radialGrad.setColorAt(1, m_BackgroundColor2);
    painter.setBrush(QBrush(radialGrad));
    painter.drawEllipse(m_Position, this->width()*0.41, this->height()*0.41);

    // Draw pad arrows
    const qreal ARROW_SCALE = 0.2;
    const qreal ARROW_WIDTH = this->width()*ARROW_SCALE;
    const qreal ARROW_HEIGHT = this->height()*ARROW_SCALE;
    const qreal ARROW_DISTANCE = 0.38;
    const qreal ARROW_ANGLE = 60;

    QRectF rectangle(m_Position.x()-ARROW_WIDTH/2, m_Position.y()-ARROW_HEIGHT/2, ARROW_WIDTH, ARROW_HEIGHT);

    painter.setBrush(m_BackgroundColor1);
    painter.setOpacity(0.5);

    painter.drawPie(rectangle.adjusted(0, this->height()*ARROW_DISTANCE, 0, this->height()*ARROW_DISTANCE), (90-ARROW_ANGLE/2) * 16, ARROW_ANGLE * 16);
    painter.drawPie(rectangle.adjusted(this->width()*ARROW_DISTANCE, 0, this->width()*ARROW_DISTANCE, 0), (180-ARROW_ANGLE/2) * 16, ARROW_ANGLE * 16);
    painter.drawPie(rectangle.adjusted(0, this->height()*-ARROW_DISTANCE, 0, this->height()*-ARROW_DISTANCE), (270-ARROW_ANGLE/2) * 16, ARROW_ANGLE * 16);
    painter.drawPie(rectangle.adjusted(this->width()*-ARROW_DISTANCE, 0, this->width()*-ARROW_DISTANCE, 0), (360-ARROW_ANGLE/2) * 16, ARROW_ANGLE * 16);
    
    // Draw the cross in the middle
    painter.setOpacity(1);
    painter.drawLine(this->width()*0.48, this->height()/2, this->width()*0.52+1, this->height()/2);
    painter.drawLine(this->width()/2, this->height()*0.48, this->width()/2, this->height()*0.52+1);
}
예제 #6
0
void Lighting::setupScene()
{
    m_scene.setSceneRect(-300, -200, 600, 460);

    QLinearGradient linearGrad(QPointF(-100, -100), QPointF(100, 100));
    linearGrad.setColorAt(0, QColor(255, 255, 255));
    linearGrad.setColorAt(1, QColor(192, 192, 255));
    setBackgroundBrush(linearGrad);

    QRadialGradient radialGrad(30, 30, 30);
    radialGrad.setColorAt(0, Qt::yellow);
    radialGrad.setColorAt(0.2, Qt::yellow);
    radialGrad.setColorAt(1, Qt::transparent);

    QPixmap pixmap(60, 60);
    pixmap.fill(Qt::transparent);

    QPainter painter(&pixmap);
    painter.setPen(Qt::NoPen);
    painter.setBrush(radialGrad);
    painter.drawEllipse(0, 0, 60, 60);
    painter.end();

    m_lightSource = m_scene.addPixmap(pixmap);
    m_lightSource->setZValue(2);

    for (int i = -2; i < 3; ++i)
        for (int j = -2; j < 3; ++j) {
            QAbstractGraphicsShapeItem *item;
            if ((i + j) & 1)
                item = new QGraphicsEllipseItem(0, 0, 50, 50);
            else
                item = new QGraphicsRectItem(0, 0, 50, 50);

            item->setPen(QPen(Qt::black, 1));
            item->setBrush(QBrush(Qt::white));
            QGraphicsDropShadowEffect *effect = new QGraphicsDropShadowEffect;
            effect->setBlurRadius(8);
            item->setGraphicsEffect(effect);
            item->setZValue(1);
            item->setPos(i * 80, j * 80);
            m_scene.addItem(item);
            m_items << item;
        }


}
예제 #7
0
LensItem::LensItem(QRectF geom, LensDialog *parent) : QGraphicsRectItem(geom)
{
	dialog = parent;
	strength = -100.0;
	scaling = 1.0,
	handle = -1;
	setPen(QPen(Qt::black));
	QRadialGradient radialGrad(QPointF(0.5, 0.5), 1.0);
	radialGrad.setColorAt(0.0, QColor(255, 0, 0, 127));
	radialGrad.setColorAt(0.1, QColor(255, 0, 0, 127));
	radialGrad.setColorAt(1.0, QColor(255, 255, 255, 0));
#if QT_VERSION  >= 0x040301
	radialGrad.setCoordinateMode(QGradient::ObjectBoundingMode);
#endif
	setBrush(radialGrad);
	setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
	setAcceptsHoverEvents(true);
}
예제 #8
0
int main()
{
    QWidget anyPaintDevice;
    {
        // PEN SNIPPET
        QPainter painter;
        QPen pen(Qt::red, 2);                 // red solid line, 2 pixels wide
        painter.begin(&anyPaintDevice);   // paint something
        painter.setPen(pen);              // set the red, wide pen
        painter.drawRect(40,30, 200,100); // draw a rectangle
        painter.setPen(Qt::blue);             // set blue pen, 0 pixel width
        painter.drawLine(40,30, 240,130); // draw a diagonal in rectangle
        painter.end();                    // painting done
    }

    {
        // BRUSH SNIPPET
        QPainter painter;
        QBrush brush(Qt::yellow);           // yellow solid pattern
        painter.begin(&anyPaintDevice);   // paint something
        painter.setBrush(brush);          // set the yellow brush
        painter.setPen(Qt::NoPen);        // do not draw outline
        painter.drawRect(40,30, 200,100); // draw filled rectangle
        painter.setBrush(Qt::NoBrush);    // do not fill
        painter.setPen(Qt::black);            // set black pen, 0 pixel width
        painter.drawRect(10,10, 30,20);   // draw rectangle outline
        painter.end();                    // painting done
    }

    // LINEAR
//! [0]
    QLinearGradient linearGrad(QPointF(100, 100), QPointF(200, 200));
    linearGrad.setColorAt(0, Qt::black);
    linearGrad.setColorAt(1, Qt::white);
//! [0]

    // RADIAL
//! [1]
    QRadialGradient radialGrad(QPointF(100, 100), 100);
    radialGrad.setColorAt(0, Qt::red);
    radialGrad.setColorAt(0.5, Qt::blue);
    radialGrad.setColorAt(1, Qt::green);
//! [1]
}
예제 #9
0
void MainGraphicsView::createLightingMap(unsigned char lighting_min) {
    LOG("MainGraphicsView::createLightingMap(): lighting_min = %d\n", lighting_min);
    this->darkness_alpha = (unsigned char)(255 - (int)lighting_min);
    if( game_g->isLightingEnabled() )
    {
        const int res_c = 128;
        QPixmap pixmap(res_c, res_c);
        pixmap.fill(Qt::transparent);
        QRadialGradient radialGrad((res_c-1)/2, (res_c-1)/2, (res_c-1)/2);
        radialGrad.setColorAt(0.0, QColor(0, 0, 0, 0));
        radialGrad.setColorAt(1.0, QColor(0, 0, 0, darkness_alpha));
        QPainter painter2(&pixmap);
        painter2.setPen(Qt::NoPen);
        painter2.fillRect(0, 0, res_c, res_c, radialGrad);
        painter2.end();

        this->calculated_lighting_pixmap = true;
        this->lighting_pixmap = pixmap;
    }
}
예제 #10
0
void MousePadWidgetInternal::paintEvent(QPaintEvent *)
{
	QPainter p(this);

	Vector3D center(this->width() / 2, this->height() / 2, 0);
	double radius = center.length();
	QPoint qcenter(this->width() / 2, this->height() / 2);

	QRadialGradient radialGrad(qcenter, radius, mLastPos);
	radialGrad.setColorAt(0.0, QColor("khaki"));
	radialGrad.setColorAt(0.4, QColor("lightgrey"));
	radialGrad.setColorAt(1, QColor("dimgrey"));

	QColor color(146, 0, 146);
	QBrush brush(radialGrad);

	p.setPen(QColor(146, 0, 146));
	p.setBrush(QColor(146, 0, 146));
	p.fillRect(0, 0, width() - 1, height() - 1, brush);
}
예제 #11
0
void StatusLight::paintEvent( QPaintEvent* )
{
	QPainter p( this );
	p.setRenderHint( QPainter::Antialiasing, true );
	p.setWindow( -50,-50, 100, 100 );
	
	p.setPen( Qt::white );
	p.drawArc( -25, -25, 50, 50, 0, 5670 );
	p.drawArc( -32, -33, 66, 66, 0, 5670 );
	p.setPen( QColor(Qt::darkGray).lighter( 125 ) );
	p.drawArc( -34, -33, 66, 66, 0, 180*16 );
	
    QRadialGradient radialGrad(QPointF(0, -14), 20);
    radialGrad.setColorAt( 0, QColor( 0xff, 0xff, 0xff, 0.8 ) );
    radialGrad.setColorAt( 1, m_color );

    QBrush brush(radialGrad);
    p.setBrush(brush);
    p.setPen( m_color.darker() );
    p.drawEllipse(-25,-25,50,50);
}
예제 #12
0
void GameWidget::resizeEvent(QResizeEvent* /*event*/)
{
    const int old_bubblesize = bubblesize;
    const int max_size = qMin(width(), height());

    margin = max_size / 70; //separates bubbles from each other and the widget border
    bubblesize = (max_size - margin*(grid_size+1)) / grid_size;

    //center grid
    xoff = (width() - margin*(grid_size+1) - bubblesize*grid_size)/2;
    yoff = (height() -margin*(grid_size+1) - bubblesize*grid_size)/2;

    if(bubblesize != old_bubblesize) { //generate new pixmaps
        for(int i = 1; i <= num_colors; i++) {
            for(int j = 0; j < num_scale_steps; j++) {
                bubblePixmap[i][j] = QPixmap(bubblesize, bubblesize); //pixmaps have same size, graphic may be tinier
                bubblePixmap[i][j].fill(Qt::transparent);

                const qreal scaled_size = (1 - double(j)/num_scale_steps)*(1 - double(j)/num_scale_steps) * bubblesize;

                QPainter painter(&bubblePixmap[i][j]);
                painter.setPen(Qt::transparent);
                painter.setRenderHint(QPainter::Antialiasing, true);

                QRadialGradient radialGrad(QPointF(0.3*bubblesize, 0.3*bubblesize), 0.8*scaled_size);
                radialGrad.setColorAt(0, Qt::white);
                radialGrad.setColorAt(0.4, bubbleColor[i]);
                radialGrad.setColorAt(1, bubbleColor[i].darker(700));

                painter.setBrush(QBrush(radialGrad));
                painter.drawEllipse((bubblesize-scaled_size)/2, (bubblesize-scaled_size)/2,
                                    scaled_size, scaled_size);
            }
        }
    }

    update();
}
예제 #13
0
void tst_QPixmap::fromImageReader_data()
{
    const QString tempDir = QDir::tempPath();
    QTest::addColumn<QString>("filename");

    QImage image(2000, 2000, QImage::Format_ARGB32);
    image.fill(0);
    {
        // Generate an image with opaque and transparent pixels
        // with an interesting distribution.
        QPainter painter(&image);

        QRadialGradient radialGrad(QPointF(1000, 1000), 1000);
        radialGrad.setColorAt(0, QColor(255, 0, 0, 255));
        radialGrad.setColorAt(0.5, QColor(0, 255, 0, 255));
        radialGrad.setColorAt(0.9, QColor(0, 0, 255, 100));
        radialGrad.setColorAt(1, QColor(0, 0, 0, 0));

        painter.fillRect(image.rect(), radialGrad);
    }
    image.save("test.png");

    // RGB32
    const QString rgb32Path = tempDir + QString::fromLatin1("/rgb32.jpg");
    image.save(rgb32Path);
    QTest::newRow("gradient RGB32") << rgb32Path;

    // ARGB32
    const QString argb32Path = tempDir + QString::fromLatin1("/argb32.png");
    image.save(argb32Path);
    QTest::newRow("gradient ARGB32") << argb32Path;

    // Indexed 8
    const QString indexed8Path = tempDir + QString::fromLatin1("/indexed8.gif");
    image.save(indexed8Path);
    QTest::newRow("gradient indexed8") << indexed8Path;

}
예제 #14
0
    void paintEvent (QPaintEvent *event)
    {
        QPainter p(this);

        QRadialGradient radialGrad(QPointF(event->rect().width() / 2,
                                           event->rect().height() / 2),
                                           qMin(event->rect().width() / 2,
                                                event->rect().height() / 2));

        if (underMouse())
            radialGrad.setColorAt(0, Qt::green);
        else
            radialGrad.setColorAt(0, Qt::red);

        radialGrad.setColorAt(1, Qt::transparent);

        p.fillRect(event->rect(), radialGrad);

        p.setPen(Qt::black);
        p.drawLine(0, 15, 30, 15);
        p.drawLine(15, 0, 15, 30);

        p.end();
    }
예제 #15
0
void CSwitcher::paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget)
{
    QPen t_pen;
    painter->setPen(t_pen);
    QBrush t_brush(Qt::white);  //笔刷填充颜色:白色
	painter->setBrush(t_brush);

    painter->save();  //保存当前painter状态
	painter->setRenderHint(QPainter::Antialiasing, true);
    QRectF rectangle(2, 7, m_boundingRect.width() - 4,m_boundingRect.height() - 4);

    if(m_switcherInfo.type == SWITCH)
    {
        painter->drawRoundedRect(rectangle,20,15);
    }
    else {
        painter->drawRoundedRect(rectangle,10,5);
    }
	painter->restore();

    painter->save();
	painter->setRenderHint(QPainter::Antialiasing, true);
	QRadialGradient radialGrad(QPointF(m_boundingRect.width()/2, m_boundingRect.height()/2), m_boundingRect.height());

    radialGrad.setColorAt(0.2, QColor(150,214,241));
    radialGrad.setColorAt(0.5, QColor(83,190,249));
    radialGrad.setColorAt(1, QColor(98,176,255));

    painter->setBrush(QBrush(radialGrad));

    QRectF rectangle1(7, 12, m_boundingRect.width() - 14, m_boundingRect.height() - 14);
    if(m_switcherInfo.type == SWITCH)
    {
        painter->drawRoundedRect(rectangle1,20,15);
    }
    else {
        painter->drawRoundedRect(rectangle1,10,5);
    }

	painter->restore();
	
	if(m_switcherInfo.portNum == 32 )
	{
		painter->save();
	    painter->setRenderHint(QPainter::Antialiasing, true);
	    t_brush.setColor(m_color);
	    painter->setBrush(t_brush);
        //painter->drawEllipse(QRectF(m_boundingRect.width()/2 - 5,m_boundingRect.height() - 2 - 8,10,8)); //M duankou
	    painter->restore();
	}
	if(m_switcherInfo.portNum == 48 )
	{
		painter->save();
		painter->setRenderHint(QPainter::Antialiasing, true);
		t_brush.setColor(m_color);
		painter->setBrush(t_brush);
		painter->drawEllipse(QRectF(m_boundingRect.width()/2 - 18,m_boundingRect.height() - 2 - 8,10,8)); //M duankou 
		painter->drawEllipse(QRectF(m_boundingRect.width()/2 + 15,m_boundingRect.height()- 2 - 8,10,8));
		painter->restore();
	}


    int t_fontSize = 10;
	QFont t_font("Times New Roman");
    t_font.setPointSize(t_fontSize);
	t_font.setBold(true);
	QFontMetrics t_textFontM(t_font);

	qreal t_textHeight = t_textFontM.height();

    QString s_id = QString("%1").arg(m_switcherInfo.ID);
    QString t_str2 = s_id +"-" + m_switcherInfo.name;
	qreal t_textWidth2 = t_textFontM.width(t_str2);

    if(t_textWidth2 > m_boundingRect.width())
    {
        t_textWidth2 = m_boundingRect.width();
    }
    if(t_textHeight > m_boundingRect.height()/2)
    {
        t_textHeight = m_boundingRect.height()/4;
    }

    //限定字体大小
    if (t_textWidth2 < m_boundingRect.width())
    {
        t_fontSize = 10;
    }
    else if (t_textWidth2 > m_boundingRect.width())
    {
        t_textWidth2 = m_boundingRect.width();
        t_fontSize = m_boundingRect.width()/10;
    }
    else if(t_textHeight > m_boundingRect.height()/3)
    {
        t_textHeight = m_boundingRect.height()/4;
        t_fontSize = m_boundingRect.width()/20;
    }

	//文字
	painter->setRenderHint(QPainter::Antialiasing, true);
	painter->setFont(t_font);
	//QPointF t_text1Pos(m_boundingRect.width()/2 - t_textWidth1/2,m_boundingRect.height()/4 /*- t_textHeight*/);
	//painter->drawText(t_text1Pos.x(),t_text1Pos.y(),t_str1);

//	QPointF t_text2Pos(m_boundingRect.width()/2 - t_textWidth2/2,m_boundingRect.height()*3/4 + t_textHeight/1.5);
//	painter->drawText(t_text2Pos.x(),t_text2Pos.y(),t_str2);
    painter->drawText(0, 5, t_str2);

	//交叉线
	painter->setRenderHint(QPainter::Antialiasing, true);
    t_pen.setWidth(2);
    if(m_switcherInfo.type == SWITCH)
    {
        t_pen.setColor(Qt::white);
        painter->setPen(t_pen);
        QPointF t_pnt1(m_boundingRect.width()/8+8,m_boundingRect.height()*3/8+5);
        QPointF t_pnt2(m_boundingRect.width()*3/8+2,m_boundingRect.height()*3/8+5);
        QPointF t_pnt3(m_boundingRect.width()*5/8-2,m_boundingRect.height()*3/8+5);
        QPointF t_pnt4(m_boundingRect.width()*7/8-8,m_boundingRect.height()*3/8+5);

        QPointF t_pnt5(m_boundingRect.width()/8+8,m_boundingRect.height()*5/8+5);
        QPointF t_pnt6(m_boundingRect.width()*3/8+2,m_boundingRect.height()*5/8+5);
        QPointF t_pnt7(m_boundingRect.width()*5/8-2,m_boundingRect.height()*5/8+5);
        QPointF t_pnt8(m_boundingRect.width()*7/8-8,m_boundingRect.height()*5/8+5);


        //箭头点坐标
        QPointF t_pnt11(m_boundingRect.width()/8+8+5,m_boundingRect.height()*3/8-3+5);
        QPointF t_pnt12(m_boundingRect.width()/8+8+5,m_boundingRect.height()*3/8+3+5);

        QPointF t_pnt41(m_boundingRect.width()*7/8-8-5,m_boundingRect.height()*3/8-3+5);
        QPointF t_pnt42(m_boundingRect.width()*7/8-8-5,m_boundingRect.height()*3/8+3+5);

        QPointF t_pnt51(m_boundingRect.width()/8+8+5,m_boundingRect.height()*5/8-3+5);
        QPointF t_pnt52(m_boundingRect.width()/8+8+5,m_boundingRect.height()*5/8+3+5);

        QPointF t_pnt81(m_boundingRect.width()*7/8-8-5,m_boundingRect.height()*5/8-3+5);
        QPointF t_pnt82(m_boundingRect.width()*7/8-8-5,m_boundingRect.height()*5/8+3+5);

        painter->setRenderHint(QPainter::Antialiasing, true);
        painter->drawLine(t_pnt1,t_pnt2);
        painter->drawLine(t_pnt3,t_pnt4);
        painter->drawLine(t_pnt5,t_pnt6);
        painter->drawLine(t_pnt7,t_pnt8);
        painter->drawLine(t_pnt2,t_pnt7);
        painter->drawLine(t_pnt3,t_pnt6);

        painter->drawLine(t_pnt1,t_pnt11);
        painter->drawLine(t_pnt1,t_pnt12);
        painter->drawLine(t_pnt4,t_pnt41);
        painter->drawLine(t_pnt4,t_pnt42);
        painter->drawLine(t_pnt5,t_pnt51);
        painter->drawLine(t_pnt5,t_pnt52);
        painter->drawLine(t_pnt8,t_pnt81);
        painter->drawLine(t_pnt8,t_pnt82);
    }
    else{
        t_pen.setColor(Qt::black);
    }

	

}
예제 #16
0
파일: brushtool.cpp 프로젝트: qbdp/pencil
void BrushTool::drawStroke()
{
    StrokeTool::drawStroke();
    QList<QPointF> p = m_pStrokeManager->interpolateStroke();

    Layer* layer = mEditor->layers()->currentLayer();

    if ( layer->type() == Layer::BITMAP )
    {
        for ( int i = 0; i < p.size(); i++ )
        {
            p[ i ] = mEditor->view()->mapScreenToCanvas( p[ i ] );
        }

        qreal opacity = 1.0;
        qreal brushWidth = mCurrentWidth + 0.5 * properties.feather;
        qreal offset = qMax( 0.0, mCurrentWidth - 0.5 * properties.feather ) / brushWidth;
        opacity = mCurrentPressure;
        brushWidth = brushWidth * mCurrentPressure;

        qreal brushStep = 0.5 * mCurrentWidth + 0.5 * properties.feather;
        brushStep = brushStep * mCurrentPressure;

        //        if (usePressure) { brushStep = brushStep * tabletPressure; }
        brushStep = qMax( 1.0, brushStep );

        mCurrentWidth = properties.width;
        BlitRect rect;

        QRadialGradient radialGrad( QPointF( 0, 0 ), 0.5 * brushWidth );
        mScribbleArea->setGaussianGradient( radialGrad,
                                            mEditor->color()->frontColor(),
                                            opacity,
                                            offset );

        QPointF a = lastBrushPoint;
        QPointF b = getCurrentPoint();

        //        foreach (QSegment segment, calculateStroke(brushWidth))
        //        {
        //            QPointF a = lastBrushPoint;
        //            QPointF b = m_pScribbleArea->pixelToPoint(segment.second);

        qreal distance = 4 * QLineF( b, a ).length();
        int steps = qRound( distance ) / brushStep;

        for ( int i = 0; i < steps; i++ )
        {
            QPointF point = lastBrushPoint + ( i + 1 ) * ( brushStep )* ( b - lastBrushPoint ) / distance;
            rect.extend( point.toPoint() );
            mScribbleArea->drawBrush( point,
                                      brushWidth,
                                      offset,
                                      mEditor->color()->frontColor(),
                                      opacity );

            if ( i == ( steps - 1 ) )
            {
                lastBrushPoint = point;
            }
        }

        int rad = qRound( brushWidth ) / 2 + 2;
        mScribbleArea->refreshBitmap( rect, rad );
    }
    else if ( layer->type() == Layer::VECTOR )
    {
        qreal brushWidth = properties.width * mCurrentPressure;

        int rad = qRound( ( brushWidth / 2 + 2 ) * mEditor->view()->scaling() );

        QPen pen( mEditor->color()->frontColor(),
                  brushWidth * mEditor->view()->scaling(),
                  Qt::SolidLine,
                  Qt::RoundCap,
                  Qt::RoundJoin );

        if ( p.size() == 4 )
        {
            QPainterPath path( p[ 0 ] );
            path.cubicTo( p[ 1 ],
                          p[ 2 ],
                          p[ 3 ] );
            mScribbleArea->drawPath( path, pen, Qt::NoBrush, QPainter::CompositionMode_Source );
            mScribbleArea->refreshVector( path.boundingRect().toRect(), rad );
        }
    }
}
예제 #17
0
void BrushTool::drawStroke()
{
    StrokeTool::drawStroke();
    QList<QPointF> p = m_pStrokeManager->interpolateStroke(currentWidth);

    Layer *layer = m_pEditor->getCurrentLayer();

    if (layer->type == Layer::BITMAP)
    {
        for (int i = 0; i < p.size(); i++) {
            p[i] = m_pScribbleArea->pixelToPoint(p[i]);
        }

        qreal opacity = 1.0;
        qreal brushWidth = currentWidth +  0.5 * properties.feather;
        qreal offset = qMax(0.0, currentWidth - 0.5 * properties.feather) / brushWidth;
        opacity = currentPressure;
        brushWidth = brushWidth * currentPressure;

        //        if (tabletInUse) { opacity = tabletPressure; }
        //        if (usePressure) { brushWidth = brushWidth * tabletPressure; }

        qreal brushStep = 0.5 * currentWidth + 0.5 * properties.feather;
        brushStep = brushStep * currentPressure;

        //        if (usePressure) { brushStep = brushStep * tabletPressure; }
        brushStep = qMax(1.0, brushStep);

        currentWidth = properties.width;
        BlitRect rect;

        QRadialGradient radialGrad(QPointF(0,0), 0.5 * brushWidth);
        m_pScribbleArea->setGaussianGradient(radialGrad,
            m_pEditor->colorManager()->frontColor(),
            opacity,
            offset);

        QPointF a = lastBrushPoint;
        QPointF b = getCurrentPoint();

        //        foreach (QSegment segment, calculateStroke(brushWidth))
        //        {
        //            QPointF a = lastBrushPoint;
        //            QPointF b = m_pScribbleArea->pixelToPoint(segment.second);

        qreal distance = 4 * QLineF(b, a).length();
        int steps = qRound(distance) / brushStep;

        for (int i = 0; i < steps; i++)
        {
            QPointF point = lastBrushPoint + (i + 1) * (brushStep) * (b - lastBrushPoint) / distance;
            rect.extend(point.toPoint());
            m_pScribbleArea->drawBrush( point,
                brushWidth,
                offset,
                m_pEditor->colorManager()->frontColor(),
                opacity);

            if (i == (steps - 1))
            {
                lastBrushPoint = point;
            }
        }
        //        }

        int rad = qRound(brushWidth) / 2 + 2;
        m_pScribbleArea->refreshBitmap(rect, rad);
    }
    else if (layer->type == Layer::VECTOR)
    {
        QPen pen(Qt::gray, 1, Qt::DashLine, Qt::RoundCap, Qt::RoundJoin);
        int rad = qRound((currentWidth / 2 + 2) * qAbs(m_pScribbleArea->getTempViewScaleX()));

        //        foreach (QSegment segment, calculateStroke(currentWidth))
        //        {
        //            QPointF a = segment.first;
        //            QPointF b = segment.second;
        //            m_pScribbleArea->drawLine(a, b, pen, QPainter::CompositionMode_SourceOver);
        //            m_pScribbleArea->refreshVector(QRect(a.toPoint(), b.toPoint()), rad);
        //        }
        if (p.size() == 4) {
            QSizeF size(2,2);
            QPainterPath path(p[0]);
            path.cubicTo(p[1],
                p[2],
                p[3]);
            m_pScribbleArea->drawPath(path, pen, Qt::NoBrush, QPainter::CompositionMode_Source);
            m_pScribbleArea->refreshVector(path.boundingRect().toRect(), rad);
        }
    }
}
예제 #18
0
/*!
  Reimplementation of QGraphicsItem::paint(). This function does the actual painting of the legend.
  \sa QGraphicsItem::paint().
*/
void CartesianPlotLegendPrivate::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) {
	Q_UNUSED(option);
	Q_UNUSED(widget);
	if (!isVisible())
		return;

	painter->save();

	//draw the area
	painter->setOpacity(backgroundOpacity);
	painter->setPen(Qt::NoPen);
	if (backgroundType == PlotArea::Color){
		switch (backgroundColorStyle){
			case PlotArea::SingleColor:{
				painter->setBrush(QBrush(backgroundFirstColor));
				break;
			}
			case PlotArea::HorizontalLinearGradient:{
				QLinearGradient linearGrad(rect.topLeft(), rect.topRight());
				linearGrad.setColorAt(0, backgroundFirstColor);
				linearGrad.setColorAt(1, backgroundSecondColor);
				painter->setBrush(QBrush(linearGrad));
				break;
			}
			case PlotArea::VerticalLinearGradient:{
				QLinearGradient linearGrad(rect.topLeft(), rect.bottomLeft());
				linearGrad.setColorAt(0, backgroundFirstColor);
				linearGrad.setColorAt(1, backgroundSecondColor);
				painter->setBrush(QBrush(linearGrad));
				break;
			}
			case PlotArea::TopLeftDiagonalLinearGradient:{
				QLinearGradient linearGrad(rect.topLeft(), rect.bottomRight());
				linearGrad.setColorAt(0, backgroundFirstColor);
				linearGrad.setColorAt(1, backgroundSecondColor);
				painter->setBrush(QBrush(linearGrad));
				break;
			}
			case PlotArea::BottomLeftDiagonalLinearGradient:{
				QLinearGradient linearGrad(rect.bottomLeft(), rect.topRight());
				linearGrad.setColorAt(0, backgroundFirstColor);
				linearGrad.setColorAt(1, backgroundSecondColor);
				painter->setBrush(QBrush(linearGrad));
				break;
			}
			case PlotArea::RadialGradient:{
				QRadialGradient radialGrad(rect.center(), rect.width()/2);
				radialGrad.setColorAt(0, backgroundFirstColor);
				radialGrad.setColorAt(1, backgroundSecondColor);
				painter->setBrush(QBrush(radialGrad));
				break;
			}
		}
	}else if (backgroundType == PlotArea::Image){
		if ( !backgroundFileName.trimmed().isEmpty() ) {
			QPixmap pix(backgroundFileName);
			switch (backgroundImageStyle){
				case PlotArea::ScaledCropped:
					pix = pix.scaled(rect.size().toSize(),Qt::KeepAspectRatioByExpanding,Qt::SmoothTransformation);
					painter->drawPixmap(rect.topLeft(),pix);
					break;
				case PlotArea::Scaled:
					pix = pix.scaled(rect.size().toSize(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);
					painter->drawPixmap(rect.topLeft(),pix);
					break;
				case PlotArea::ScaledAspectRatio:
					pix = pix.scaled(rect.size().toSize(),Qt::KeepAspectRatio,Qt::SmoothTransformation);
					painter->drawPixmap(rect.topLeft(),pix);
					break;
				case PlotArea::Centered:
					painter->drawPixmap(QPointF(rect.center().x()-pix.size().width()/2,rect.center().y()-pix.size().height()/2),pix);
					break;
				case PlotArea::Tiled:
					painter->drawTiledPixmap(rect,pix);
					break;
				case PlotArea::CenterTiled:
					painter->drawTiledPixmap(rect,pix,QPoint(rect.size().width()/2,rect.size().height()/2));
			}
		}
	} else if (backgroundType == PlotArea::Pattern){
		painter->setBrush(QBrush(backgroundFirstColor,backgroundBrushStyle));
	}

	if ( qFuzzyIsNull(borderCornerRadius) )
		painter->drawRect(rect);
	else
		painter->drawRoundedRect(rect, borderCornerRadius, borderCornerRadius);

	//draw the border
	if (borderPen.style() != Qt::NoPen){
		painter->setPen(borderPen);
		painter->setBrush(Qt::NoBrush);
		painter->setOpacity(borderOpacity);
		if ( qFuzzyIsNull(borderCornerRadius) )
			painter->drawRect(rect);
		else
			painter->drawRoundedRect(rect, borderCornerRadius, borderCornerRadius);
	}

	//draw curve's line+symbol and the names
	int curveCount = curvesList.size();
	QFontMetrics fm(labelFont);
	float h=fm.ascent();
	XYCurve* curve;

	painter->setFont(labelFont);

	//translate to left upper conner of the bounding rect plus the layout offset and the height of the title
	painter->translate(-rect.width()/2+layoutLeftMargin, -rect.height()/2+layoutTopMargin);
	if (title->isVisible() && !title->text().text.isEmpty())
		painter->translate(0, title->graphicsItem()->boundingRect().height());

	painter->save();

	int index;
	for (int c=0; c<columnCount; ++c) {
		for (int r=0; r<rowCount; ++r) {
			if (labelColumnMajor)
				index = c*rowCount + r;
			else
				index = r*columnCount + c;

			if ( index >= curveCount )
				break;

			curve = curvesList.at(index);

			//curve's line (painted at the half of the ascent size)
			if (curve->lineType() != XYCurve::NoLine){
				painter->setPen(curve->linePen());
				painter->setOpacity(curve->lineOpacity());
				painter->drawLine(0, h/2, lineSymbolWidth, h/2);
			}

			//error bars
			if ( (curve->xErrorType() != XYCurve::NoError) || (curve->yErrorType() != XYCurve::NoError) ) {
				painter->setOpacity(curve->errorBarsOpacity());
				painter->setPen(curve->errorBarsPen());

				//curve's error bars for x
				float errorBarsSize = Worksheet::convertToSceneUnits(10, Worksheet::Point);
				if (curve->symbolsStyle()!=Symbol::NoSymbols && errorBarsSize<curve->symbolsSize()*1.4)
					errorBarsSize = curve->symbolsSize()*1.4;

				switch(curve->errorBarsType()) {
					case XYCurve::ErrorBarsSimple:
						//horiz. line
						painter->drawLine(lineSymbolWidth/2-errorBarsSize/2, h/2,
										  lineSymbolWidth/2+errorBarsSize/2, h/2);
						//vert. line
						painter->drawLine(lineSymbolWidth/2, h/2-errorBarsSize/2,
										  lineSymbolWidth/2, h/2+errorBarsSize/2);
						break;
					case XYCurve::ErrorBarsWithEnds: {
						//horiz. line
						painter->drawLine(lineSymbolWidth/2-errorBarsSize/2, h/2,
										  lineSymbolWidth/2+errorBarsSize/2, h/2);

						//vert. line
						painter->drawLine(lineSymbolWidth/2, h/2-errorBarsSize/2,
										  lineSymbolWidth/2, h/2+errorBarsSize/2);

						//caps for the horiz. line
						painter->drawLine(lineSymbolWidth/2-errorBarsSize/2, h/2-errorBarsSize/4,
										  lineSymbolWidth/2-errorBarsSize/2, h/2+errorBarsSize/4);
						painter->drawLine(lineSymbolWidth/2+errorBarsSize/2, h/2-errorBarsSize/4,
										  lineSymbolWidth/2+errorBarsSize/2, h/2+errorBarsSize/4);

						//caps for the vert. line
						painter->drawLine(lineSymbolWidth/2-errorBarsSize/4, h/2-errorBarsSize/2,
										  lineSymbolWidth/2+errorBarsSize/4, h/2-errorBarsSize/2);
						painter->drawLine(lineSymbolWidth/2-errorBarsSize/4, h/2+errorBarsSize/2,
										  lineSymbolWidth/2+errorBarsSize/4, h/2+errorBarsSize/2);
						break;
					}
				}
			}

			//curve's symbol
			if (curve->symbolsStyle()!=Symbol::NoSymbols){
				painter->setOpacity(curve->symbolsOpacity());
				painter->setBrush(curve->symbolsBrush());
				painter->setPen(curve->symbolsPen());

				QPainterPath path = Symbol::pathFromStyle(curve->symbolsStyle());
				QTransform trafo;
				trafo.scale(curve->symbolsSize(), curve->symbolsSize());
				path = trafo.map(path);

				if (curve->symbolsRotationAngle() != 0) {
					trafo.reset();
					trafo.rotate(curve->symbolsRotationAngle());
					path = trafo.map(path);
				}

				painter->translate(QPointF(lineSymbolWidth/2, h/2));
				painter->drawPath(path);
				painter->translate(-QPointF(lineSymbolWidth/2, h/2));
			}

			//curve's name
			painter->setPen(QPen(labelColor));
			painter->setOpacity(1.0);
			painter->drawText(QPoint(lineSymbolWidth+layoutHorizontalSpacing, h), curve->name());
			painter->translate(0,layoutVerticalSpacing+h);
		}

		//translate to the beginning of the next column
		painter->restore();
		int deltaX = lineSymbolWidth+layoutHorizontalSpacing+maxColumnTextWidths.at(c); //the width of the current columns
		deltaX += 2*layoutHorizontalSpacing; //spacing between two columns
		painter->translate(deltaX,0);
		painter->save();
	}

	painter->restore();
	painter->restore();

	if (m_hovered && !isSelected() && !m_printing){
		painter->setPen(q->hoveredPen);
		painter->setOpacity(q->hoveredOpacity);
		painter->drawPath(shape());
	}

	if (isSelected() && !m_printing){
		painter->setPen(q->selectedPen);
		painter->setOpacity(q->selectedOpacity);
		painter->drawPath(shape());
	}
}
예제 #19
0
void TimelineWidget::paintEvent(QPaintEvent* event)
{
	if (similar(mStart,mStop))
		return;
	QWidget::paintEvent(event);

	QPainter painter(this);
//  QPen pointPen, pointLinePen;
	painter.setRenderHint(QPainter::Antialiasing);
	painter.setPen(Qt::NoPen);

	QColor gray0(240, 240, 240);
	QColor gray01(220, 220, 220);
	QColor gray1(200, 200, 200);
	QColor gray2(170, 170, 170); // darker
	QColor gray3(150, 150, 150); // even darker
	QColor gray4(100, 100, 100); // even darker
	QColor highlight(110, 214, 255); // color around highlighted circle in qslider on KDE.

	// Fill with white background color and grey plot area background color
	QBrush brush(Qt::SolidPattern); // = painter.brush();
	brush.setColor(gray2);
	painter.setBrush(brush);

	painter.drawRoundedRect(this->mFullArea, 4, 4);
//	brush.setColor(gray01);
	brush.setColor(gray1);
	painter.setBrush(brush);
	painter.drawRoundedRect(this->mPlotArea, 4, 4);

	int margin = 1;

	// draw noncompacted interval
	for (unsigned i = 0; i < mNoncompactedIntervals.size(); ++i)
	{
		int start_p = this->mapTime2PlotX(mNoncompactedIntervals[i].mStartTime);
		int stop_p = this->mapTime2PlotX(mNoncompactedIntervals[i].mEndTime);
		QColor color = gray01;
		painter.fillRect(QRect(start_p, mPlotArea.top(), stop_p - start_p, mPlotArea.height()), color);
	}

	// draw all continous events
	for (unsigned i = 0; i < mEvents.size(); ++i)
	{
		if (!mContinousEvents.contains(mEvents[i].mGroup))
			continue;
		int start_p = this->mapTime2PlotX(mEvents[i].mStartTime);
		int stop_p = this->mapTime2PlotX(mEvents[i].mEndTime);
		int level = std::distance(mContinousEvents.begin(),
						std::find(mContinousEvents.begin(), mContinousEvents.end(), mEvents[i].mGroup));
		int level_max = mContinousEvents.size();
		int thisHeight = (mPlotArea.height()) / level_max - margin * (level_max - 1) / level_max;
		int thisTop = mPlotArea.top() + level * thisHeight + level * margin;

//		QColor color = mEventColors[level % mEventColors.size()];
		QColor color = mEvents[i].mColor;

		painter.fillRect(QRect(start_p, thisTop, stop_p - start_p, thisHeight), color);
	}

	// draw all singular events
	for (unsigned i = 0; i < mEvents.size(); ++i)
	{
		if (mContinousEvents.contains(mEvents[i].mGroup))
			continue;

		int start_p = this->mapTime2PlotX(mEvents[i].mStartTime);
//		int stop_p = this->mapTime2PlotX(mEvents[i].mEndTime);

		int glyphWidth = 3;
		QRect rect(start_p - glyphWidth / 2, mPlotArea.top(), glyphWidth, mPlotArea.height());

		brush.setColor(QColor(50, 50, 50));
		painter.setBrush(brush);
		painter.drawRoundedRect(rect, 2, 2);

//		painter.fillRect(rect, gray4);
		if (rect.width() > 2 && rect.height() > 2)
		{
			rect.adjust(1, 1, -1, -1);
			painter.fillRect(rect, gray2);
		}
	}

	int offset_p = this->mapTime2PlotX(mPos);
	QPolygonF glyph;
	int z = 5;
	int h = mPlotArea.height();
	glyph.push_back(QPointF(-z, 0));
	glyph.push_back(QPointF(z, 0));
	glyph.push_back(QPointF(z, 0.7 * h));
	glyph.push_back(QPointF(0, h));
	glyph.push_back(QPointF(-z, 0.7 * h));
	glyph.translate(offset_p, 0);
	if (this->hasFocus() || mCloseToGlyph)
		painter.setPen(highlight);
	else
		painter.setPen(gray4);
//  QBrush brush(Qt::SolidPattern);// = painter.brush();

	QRadialGradient radialGrad(QPointF(offset_p, h / 3), 2 * h / 3);
	radialGrad.setColorAt(0, gray0);
//  radialGrad.setColorAt(0.5, Qt::blue);
	radialGrad.setColorAt(1, gray2);

	brush = QBrush(radialGrad);
//  brush.setColor(gray0);
	painter.setBrush(brush);
	painter.drawPolygon(glyph);
}