Qt5重叠窗口小部件未正确调整大小

时间:2016-10-29 18:12:39

标签: c++ qt5.5

我正在尝试设计一个与另一个重叠的小部件。我成功完成了它,但在QMainWindow的调整大小事件中我遇到了一个小问题。

我创建了一个OverlayView小部件,派生自QWidget。使用的构造函数定义如下:

OverlayView::OverlayView(QWidget* widget, const QColor& color, float opacity, OverLayPosition position) :
    QWidget(nullptr),
    referenceWidget_(widget),
    overlayPosition_(position),
    opacity_(opacity),
    overlayColor_(color)
{
    overlayRect_ = referenceWidget_->rect();
    overlayRect_.setWidth(overlayRect_.width() * 0.05f);
    setAutoFillBackground(false);
    setWindowFlags(Qt::FramelessWindowHint);
    setAttribute(Qt::WA_TranslucentBackground);
    setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
}

referenceWidget_类成员是指向用于获取其大小的窗口小部件的指针。在我的项目中,我使用了QMainWindow

我刚做了一个小实验,看看OverlayView窗口小部件是否正确调整大小:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    QPlainTextEdit* pte = new QPlainTextEdit(this);
    pte->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    setCentralWidget(pte);

    overlayView_ = new OverlayView(this, QColor(0x33, 0x99, 0x38, 120));
    overlayView_->setParent(this);

    connect(this, SIGNAL(updateOverlaySize(const QRect&)), overlayView_, SLOT(updateOverlaySize(const QRect&)));
}

OverlayView窗口小部件通过我updateOverlaySize的{​​{1}}信号连接到updateOverlaySize广告位,如下所示:

QMainWindow

void MainWindow::resizeEvent(QResizeEvent* event) { QMainWindow::resizeEvent(event); emit updateOverlaySize(rect()); } 的{​​{1}}广告位的定义如下:

updateOverlaySize

仅出于测试目的,叠加层占用OverlayView

最后,通过重新定义void OverlayView::updateOverlaySize(const QRect& rect) { overlayRect_ = rect; } 的{​​{1}}来绘制叠加层:

QMainWindow

结果如下:

Expected result

一切似乎都很好......

Not an expected result

......嗯,不是真的。当paintEvent的大小超过某个值时,叠加会停止调整大小。

OverlayView广告位收到的void OverlayView::paintEvent(QPaintEvent*) { QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); painter.setPen(Qt::NoPen); painter.fillRect(overlayRect_, overlayColor_); } 对象显示正确的值。

如果有人可以帮我解决这个问题。谢谢你的回答。

1 个答案:

答案 0 :(得分:0)

我会回答我自己的问题。

我只是想要更新我的小部件的几何。根据Qt doc,几何属性执行此操作:

  

此属性保存窗口小部件相对于其父窗口的几何   并排除窗框。

     

更改几何图形时,窗口小部件(如果可见)会接收移动   event(moveEvent())和/或resize事件(resizeEvent())立即生效。   如果窗口小部件当前不可见,则保证接收   在展示之前的适当事件。

     

如果尺寸组件位于由定义的范围之外,则调整尺寸组件   minimumSize()和maximumSize()。

overlayRect_类成员已成功更新,但不是我的小部件的大小。这似乎是一个问题。

更新updateOverlaySize广告位中的几何图形,修复此问题:

void OverlayView::updateOverlaySize(const QRect& rect)
{
    overlayRect_ = rect;
    setgeometry(rect);
}

现在,size()小部件的OverlayView方法正在恢复其实际大小。