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
小部件通过我QMainWindow
的updateOverlaySize
信号连接到updateOverlaySize
插槽,使用如下:
void MainWindow::resizeEvent(QResizeEvent* event)
{
QMainWindow::resizeEvent(event);
emit updateOverlaySize(rect());
}
OverlayView
的updateOverlaySize
槽定义如下:
void OverlayView::updateOverlaySize(const QRect& rect)
{
overlayRect_ = rect;
}
仅出于测试目的,叠加层占据 QMainWindow
。
最后通过重新定义OverlayView
的paintEvent
来绘制叠加层:
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()
方法正在返回其实际大小。
我正在尝试设计一个与另一个重叠的小部件。我成功地做到了,但是在 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
小部件通过我QMainWindow
的updateOverlaySize
信号连接到updateOverlaySize
插槽,使用如下:
void MainWindow::resizeEvent(QResizeEvent* event) { QMainWindow::resizeEvent(event); emit updateOverlaySize(rect()); }
OverlayView
的updateOverlaySize
槽定义如下:
void OverlayView::updateOverlaySize(const QRect& rect) { overlayRect_ = rect; }
仅出于测试目的,叠加层占据 QMainWindow
。
最后通过重新定义OverlayView
的paintEvent
来绘制叠加层:
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()
方法正在返回其实际大小。