gpt4 book ai didi

c++ - QGraphicsView 可能的错误?

转载 作者:行者123 更新时间:2023-11-28 01:07:00 26 4
gpt4 key购买 nike

示例代码来 self 的项目。我已尽力使其尽可能简短并切中要点。

叠加层用于覆盖应用中的所有其他小部件。这适用于大多数小部件,但今天我开始注意到 QAbstractScrollArea 子类给我带来了困难。问题是叠加层没有出现在顶部,并且发生的任何绘图都被阻止了。

#include <QtGui/QApplication>
#include <QtGui/QVBoxLayout>
#include <QtGui/QGraphicsView>
#include <QtGui/QPushButton>

class View : public QGraphicsView{
public:
View(){
//delete viewport(); setViewport(new QWidget);
}
};

class Widget : public QWidget{

QWidget* overlay_;

public:
Widget(){
resize(512, 512);
QVBoxLayout* layout = new QVBoxLayout;
QPushButton* button = new QPushButton(" Click Me! ");
layout->addWidget(button);
layout->addWidget(new View);
overlay_ = new QWidget(this);
overlay_->installEventFilter(this);
connect(button, SIGNAL(clicked()),
overlay_, SLOT(show()));
overlay_->hide();
setLayout(layout);
}

bool eventFilter(QObject* target, QEvent* event){

if(target == overlay_){
if(event->type() == QEvent::Paint && overlay_->isVisible()){
overlay_->resize(size());
QPainter painter(overlay_);
painter.setPen(QPen(QColor(1, 102, 192, 255), 1, Qt::SolidLine,
Qt::FlatCap, Qt::MiterJoin));
painter.drawRect(rect().adjusted(60, 0, -60, 0));
return true;
}
}
}
};


int main(int argc, char *argv[]){

QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}

要在此示例中解决此问题并让叠加层位于 View 之上,您需要取消注释顶部的注释行。所以我的问题是:为什么我需要在构造函数中删除并分配一个新的视口(viewport)小部件才能使叠加层不被 overdraw ?

最佳答案

这不是 QGraphicsView 的错误,如果您也使用标准的 QScrollArea,它就会发生。

我认为问题在于 Qt 绘制子部件的顺序。同级小部件按照它们添加到父级的顺序绘制(尽管您不能依赖于此)。

重置视口(viewport)“解决”问题的原因是,当您这样做时,您创建了一个没有背景作为视口(viewport)的新 QWidget。 QGraphicsView 仍在 overlay_ 上绘制,它只是有一个透明视口(viewport)。但是,请注意它仍然是如何绘制在按钮后面的。

如果你只想在 QGraphicsView 上绘制覆盖,你可以覆盖 QGraphicsView::paintEvent() 并在那里进行。如果您想在整个小部件上绘制叠加层,我会将您的布局嵌入到第二个 QWidget 中,然后尝试使用 QWidget::raise() 强制叠加层在视觉上位于顶部。

关于c++ - QGraphicsView 可能的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5544854/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com