QGraphicsView возможная ошибка? - PullRequest
0 голосов
/ 05 апреля 2011

Пример кода из моего проекта.Я попытался сделать его как можно короче и точнее.

Наложение используется для отрисовки всех других виджетов в приложении.Это работает для большинства виджетов, но сегодня я начал замечать, что подклассы 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, необходимо раскомментироватьпрокомментированная строка вверху.Поэтому мой вопрос заключается в следующем: почему мне нужно удалить и назначить новый виджет видового экрана в конструкторе, чтобы оверлей не перерисовывался?

1 Ответ

3 голосов
/ 05 апреля 2011

Это не ошибка в QGraphicsView, это произойдет, если вы также используете стандартную QScrollArea.

Проблема, я думаю, в том, в каком порядке Qt рисует дочерние виджеты. Виджеты-братья отображаются в том порядке, в котором они добавлены к родителю (хотя вы не можете на это полагаться).

Причина, по которой сброс окна просмотра «решил» проблему, заключается в том, что когда вы делаете это, вы создаете новый QWidget, у которого нет фона для области просмотра. QGraphicsView все еще отрисовывается поверх оверлея_, он просто имеет прозрачный видовой экран. Однако обратите внимание, как она все еще нарисована за кнопкой.

Если вы хотите нарисовать наложение только поверх QGraphicsView, вы можете переопределить QGraphicsView :: paintEvent () и сделать это там. Если вы хотите нарисовать наложение поверх всего вашего виджета, я бы встроил ваш макет во второй QWidget, а затем попытался использовать QWidget :: Повышать (), чтобы визуально переместить наложение наверх.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...