Q格拉菲cs查看可能的错误

QGraphicsView possible bug?

本文关键字:错误 cs      更新时间:2023-10-16

示例代码来自我的项目。 我试图让它尽可能简短和切中要害。

叠加层用于绘制应用程序中的所有其他微件。 这适用于大多数小部件,但今天我开始注意到 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();
}

若要在此示例中解决此问题并使覆盖位于视图顶部,您需要取消注释顶部的注释行。 所以我的问题是:为什么我需要在构造函数中删除并分配一个新的视口小部件才能不被覆盖?

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

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

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

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