Qt5 覆盖小部件无法正确调整大小

Qt5 overlay widget not resizing properly

我正在尝试设计一个与另一个重叠的小部件。我成功地做到了,但是在 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_ class 成员是指向用于获取其大小的小部件的指针。在我的项目中,我使用了我的 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小部件通过我QMainWindowupdateOverlaySize信号连接到updateOverlaySize插槽,使用如下:

void MainWindow::resizeEvent(QResizeEvent* event)
{
    QMainWindow::resizeEvent(event);
    emit updateOverlaySize(rect());
}

OverlayViewupdateOverlaySize槽定义如下:

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

仅出于测试目的,叠加层占据 QMainWindow

最后通过重新定义OverlayViewpaintEvent来绘制叠加层:

void OverlayView::paintEvent(QPaintEvent*)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setPen(Qt::NoPen);
    painter.fillRect(overlayRect_, overlayColor_);
}

结果如下:

一切似乎都很好...

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

updateOverlaySize 插槽接收到的 QRect 对象显示正确的值。

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

我会回答我自己的问题。

我只是忘记更新我的小部件的几何形状。根据 Qt 文档,几何 属性 这样做:

This property holds the geometry of the widget relative to its parent and excluding the window frame.

When changing the geometry, the widget, if visible, receives a move event (moveEvent()) and/or a resize event (resizeEvent()) immediately. If the widget is not currently visible, it is guaranteed to receive appropriate events before it is shown.

The size component is adjusted if it lies outside the range defined by minimumSize() and maximumSize().

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

更新 updateOverlaySize 插槽中的几何图形修复了此问题:

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

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