2017-06-06 110 views
1

我想用QRubberBand来绘制一个矩形。我需要矩形边框是不透明的,其内部是透明的。但是,我只能以其他方式来做到这一点,边框是透明的,填充不透明。这里是我使用的代码,无法获得透明QRubberband

class roiFrame : public QRubberBand 
{ 
public: 
    roiFrame(Shape s, QWidget * p = 0):QRubberBand(s, p){} 
    ~roiFrame(){} 


protected: 
    void paintEvent(QPaintEvent *pe) 
    { 
     Q_UNUSED(pe); 

     QStyleOptionRubberBand opt; 
     QStylePainter painter(this); 
     painter.setOpacity(0.8); // from aamer4yu 
     opt.initFrom(this); 
     // opt.opcatiy = false; //This one also makes the border to be transparent . 
     painter.drawControl(QStyle::CE_FocusFrame, opt); 
    } 
}; 

作为替代方案,我尝试使用QPainter::drawRect绘制一个矩形:

myWindow::myWindow(QWidget *parent): QFrame(parent) 
{ 
    ui.setupUi(this); 
} 

myWindow::~myWindow() 
{ 
} 

void myWindow::mouseReleaseEvent(QMouseEvent * event) 
{ 
    releaseX = event->x(); 
    releaseY = event->y(); 
} 

void myWindow::mousePressEvent(QMouseEvent * event) 
{ 
    pressX = event->x(); 
    pressY = event->y(); 
} 

void myWindow::paintEvent(QPaintEvent *event) 
{ 
    QFrame::paintEvent(event); 
    QRectF rectangle(pressX,pressY,releaseX,releaseY); 
    QPainter painter(this); 
    painter.setOpacity(0.8); 
    painter.drawRect(rectangle); 
    painter.end(); 
} 
+0

默认的'QRubberBand :: paintEvent'有什么问题?或者为什么不使用'QStyle :: CE_RubberBand'作为'drawControl'的第一个参数? – m7913d

+0

我无法使用默认paintEvent获得透明矩形,所以我修改了它们。 QStyle :: CE_RubberBand也没有完成这项工作。 我试图在视频上绘制矩形,基于鼠标按下事件。 drawRect函数也没有做这项工作。 – Som

+0

你可以添加你用'drawRect'试过的东西吗?正如你想要一个非常具体的结果,使用这个低级函数似乎适合我。 – m7913d

回答

0

drawRect的问题是,你没有指定的矩形应该如何看象,即边界的性质和其内部:

在你的情况下,只有边界应绘制。所以,你应该使用这样的事情:

painter.setPen(Qt::red); 

备注

  • 注意,它可能需要调用QWidget::update强制重绘事件。
  • 请注意,QRectF的第三个和第四个构造函数参数是宽度和高度,而不是右下角坐标。作为替代,您可以使用following constructor overloadQRectF rectangle(QPointF(pressX,pressY),QPointF(releaseX,releaseY));