QRubberBand之类的功能 - 静态选择区域

时间:2010-12-29 09:24:00

标签: c++ qt selection

我正在尝试在桌面/打开的窗口顶部绘制一个选择区域,使用QRubberBand可以很好地工作,但是因为它没有样式表命令,我怎么能够改变边框的颜色和宽度,使其内部完全透明?

编辑:在Qt中是否有比QRubberBand更类似的方法?更改画家方法会产生很多问题(边框在左侧和顶部比右侧和底部大一个像素,标记区域似乎不能完全透明)。

Edit2:它将覆盖的区域是静态的,而不是用户拖动的区域。

EDIT3:

class CustomRubberBand : public QRubberBand
{
public:

    CustomRubberBand(Shape s, QWidget * p = 0) : QRubberBand(s, p) 
    {   
    }

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

        QPainter painter;
        QPen pen(Qt::red, 6);
        pen.setStyle(Qt::SolidLine);

        painter.begin(this);
        painter.setPen(pen);
        painter.drawRect(pe->rect());
        painter.end();
    }
};

这给了我想要的边框,但我没有发现任何关于删除背景(完全透明)的工作......似乎Vista和Qt存在问题。

有关如何删除背景的任何提示?现在没有绘画方法,它是半透明的白色背景而不是默认的蓝色背景。

Edit4: 这显示了问题:Visible background error注意带边框的背景是半透明的白色。我正在使用的绘画方法不是绘制这个而是仅绘制边框。我希望它完全不可见,设置对象的不透明度也会使边框变得透明,这不应该是。

2 个答案:

答案 0 :(得分:1)

您可以在paintEvent函数中使用透明的QPalette来实现您的目标。

class ScreenViewport : public QRubberBand
{
Q_OBJECT
public:
ScreenViewport(Shape shape, QWidget *parent = 0) : QRubberBand(shape,parent){
}
protected:
void paintEvent(QPaintEvent *pe){

    pal = new QPalette(Qt::transparent);
    setPalette(*pal);

    Q_UNUSED(pe);

    QPainter painter;
    QPen pen(Qt::red, 6);
    pen.setStyle(Qt::DashLine);

    painter.begin(this);
    painter.setPen(pen);
    painter.drawRect(pe->rect());
    painter.end();
}

private:
QPalette *pal;

};

答案 1 :(得分:0)

QRubberBand继承自QWidget,后者又支持setStyleSheet功能,请参阅QRubberBand member functions列表。

如果这不适合您,只需覆盖::paintEvent,请参阅此example