【发布时间】:2016-10-29 18:12:38
【问题描述】:
我正在尝试设计一个与另一个重叠的小部件。我成功地做到了,但在我的QMainWindow 的调整大小事件中遇到了一个小问题。
我创建了一个源自QWidget 的OverlayView 小部件。使用的构造函数定义如下:
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 小部件通过我的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 对象显示正确的值。
如果有人可以帮我解决这个问题。感谢您的回答。
【问题讨论】: