2017-06-06 115 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));