我正在尝试设计一个与另一个重叠的小部件。我成功完成了它,但在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
结果如下:
一切似乎都很好......
......嗯,不是真的。当paintEvent
的大小超过某个值时,叠加会停止调整大小。
从OverlayView
广告位收到的void OverlayView::paintEvent(QPaintEvent*)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.setPen(Qt::NoPen);
painter.fillRect(overlayRect_, overlayColor_);
}
对象显示正确的值。
如果有人可以帮我解决这个问题。谢谢你的回答。
答案 0 :(得分:0)
我会回答我自己的问题。
我只是想要更新我的小部件的几何。根据Qt doc,几何属性执行此操作:
此属性保存窗口小部件相对于其父窗口的几何 并排除窗框。
更改几何图形时,窗口小部件(如果可见)会接收移动 event(moveEvent())和/或resize事件(resizeEvent())立即生效。 如果窗口小部件当前不可见,则保证接收 在展示之前的适当事件。
如果尺寸组件位于由定义的范围之外,则调整尺寸组件 minimumSize()和maximumSize()。
overlayRect_
类成员已成功更新,但不是我的小部件的大小。这似乎是一个问题。
更新updateOverlaySize
广告位中的几何图形,修复此问题:
void OverlayView::updateOverlaySize(const QRect& rect) { overlayRect_ = rect; setgeometry(rect); }
现在,size()
小部件的OverlayView
方法正在恢复其实际大小。