【问题标题】:Qt5 overlay widget not resizing properlyQt5覆盖小部件未正确调整大小
【发布时间】:2016-10-29 18:12:38
【问题描述】:

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

我创建了一个源自QWidgetOverlayView 小部件。使用的构造函数定义如下:

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 小部件通过我的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 对象显示正确的值。

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

【问题讨论】:

    标签: c++ qt5.5


    【解决方案1】:

    我会回答我自己的问题。

    我只是忽略了更新小部件的几何形状。根据 Qt doc,geometry 属性这样做:

    此属性保存小部件相对于其父级的几何形状 并且不包括窗框。

    更改几何图形时,小部件(如果可见)会收到移动 事件 (moveEvent()) 和/或调整大小事件 (resizeEvent())。 如果小部件当前不可见,则保证接收 显示之前的适当事件。

    如果大小组件超出定义的范围,则调整大小组件 最小尺寸()和最大尺寸()。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多