Cómo arreglar un problema que se pueden arrastrar Área de Qt QMainWindow con QToolBar en QGraphicsScene

votos
0

Estoy frente a un problema extraño cuando se trata de añadir una QMainWindowa una QGraphicsScene. Para todos los efectos, por favor no me recomiendan usar la QMdiAreacomo la alternativa, ya que distrae lejos de la cuestión real que estoy teniendo y no se ajusta a mis necesidades.

Aquí está el ejemplo que ejemplifica un mínimo de 2 temas clave, los cuales creo que son, posiblemente, los errores de Qt.

mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QToolBar>
#include <QVBoxLayout>

class MainWindow : public QMainWindow{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);

};

#endif // MAINWINDOW_H

mainwindow.cpp:

#include mainwindow.h


MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){
    resize(1000, 750);

    QGraphicsView* view = new QGraphicsView;
    QGraphicsScene* scene = new QGraphicsScene;
    view->setFixedSize(1000, 750);
    view->setScene(scene);
    view->scene()->setSceneRect(-150, -150, view->size().width(), view->size().height());

    setCentralWidget(view);

    QWidget* widget = new QWidget;
    widget->resize(300, 300);
    QVBoxLayout* vLay = new QVBoxLayout;

    widget->setLayout(vLay);

    QMainWindow* testWindow = new QMainWindow;
    testWindow->resize(300, 300);

    QToolBar* toolbar = new QToolBar;
    toolbar->setFloatable(false);
    toolbar->setStyleSheet(border: 1px solid red); //For better seeing the issue
    toolbar->addAction(Test);

    testWindow->addToolBar(toolbar);
    vLay->addWidget(testWindow);

    scene->addWidget(widget);
}

Ahora, es posible que rascarse la cabeza y preguntándose por qué diablos incluso estoy haciendo esto ...

tl; dr: Estoy creando una zona MDI personalizado dentro de la QGraphicsViewcon una costumbre Dock y gestor de capas. Necesito cada subventana tener un acoplable QToolBar, al igual que una QMainWindow, pero sólo los QMainWindowsoportes de esta función fuera de la caja. Cada sub-ventana es el general QWidgeten el ejemplo anterior.

Antes de convertir el contenido dentro de mi ventana secundaria a una QMainWindow, todo estaba funcionando bien, e incluso como un QMainWindowtodo es aún válido. Sin embargo, una vez que añado el QToolBarque el QMainWindowtodo empieza a ir mal.

Usted se dará cuenta de que en el arranque del programa es correcta y que el QToolBarse coloca y compensar correctamente. Ahora bien, si se intenta arrastrar el QToolBarlugar y en todo, incluso fuera de la QMainWindowy realizar una liberación de la tecla del ratón, una de dos cosas sucederá:

  1. El programa se bloqueará y tener un seguimiento de la pila muy extraño mientras se ejecuta en mi sistema actual: Qt 5.10.1 con gcc 5.2.0 en Rehl

  2. La QToolBarfijación a presión de forma incorrecta a la ubicación incorrecta en el QMainWindow. Mira de cerca a la zona rectangular predefinida cuando se arrastra y se cierne sobre un lugar acoplable válida y utilizar el borde rojo como guía.

Los accidentes son inconsistentes y, a veces ocurren cada segundo evento de arrastre después de la primera. A veces sucede en el momento que agarrar el QToolBary otras veces ocurre después de que el evento de colocación. Me añadir el seguimiento de la pila, pero cada vez que el depurador tiene una salida diferente. He visto algunos mensajes relativos a las bibliotecas nVidia.so como las siguientes:

7fd6d96c1000-7fd6daf36000 r-xp 00000000 fd:00 34442271                   /usr/lib64/libnvidia-glcore.so.390.67
7fd6daf36000-7fd6db135000 ---p 01875000 fd:00 34442271                   /usr/lib64/libnvidia-glcore.so.390.67
7fd6db135000-7fd6db4a9000 rw-p 01874000 fd:00 34442271                   /usr/lib64/libnvidia-glcore.so.390.67
7fd6db4a9000-7fd6db4c2000 rw-p 00000000 00:00 0
7fd6db4c2000-7fd6db5d3000 r-xp 00000000 fd:00 35871194                   /usr/lib64/libGLX_nvidia.so.390.67
7fd6db5d3000-7fd6db7d3000 ---p 00111000 fd:00 35871194                   /usr/lib64/libGLX_nvidia.so.390.67
7fd6db7d3000-7fd6db7f8000 rw-p 00111000 fd:00 35871194                   /usr/lib64/libGLX_nvidia.so.390.67
7fd6db7f8000-7fd6db7ff000 rw-p 00000000 00:00 0
7fd6db7ff000-7fd6db800000 ---p 00000000 00:00 0
7fd6db800000-7fd6dc000000 rw-p 00000000 00:00 0                          [stack:30187]
7fd6dc000000-7fd6dc021000 rw-p 00000000 00:00 0
7fd6dc021000-7fd6e0000000 ---p 00000000 00:00 0
7fd6e00aa000-7fd6e00ad000 r-xp 00000000 fd:00 3060689                    /usr/lib64/tls/libnvidia-tls.so.390.67
7fd6e00ad000-7fd6e02ad000 ---p 00003000 fd:00 3060689                    /usr/lib64/tls/libnvidia-tls.so.390.67
7fd6e02ad000-7fd6e02ae000 rw-p 00003000 fd:00 3060689                    /usr/lib64/tls/libnvidia-tls.so.390.67

El depurador puede tener más de 50 devoluciones de llamada de función aparecen en gris, a veces los mismos, a veces diferentes. Cabe destacar que he visto el QPropertyAnimationmezclado en esas devoluciones de llamada, pero no todo el tiempo, así que no puedo precisarlo y siento que me estoy volviendo loco.

Ahora, se podría pensar que esto tiene que ver con el QMainWindowser incorporado como QGraphicsProxyWidgetdentro de la QGraphicsSceney sólo tener un efecto secundario de eso ... pero no. Si en lugar de añadir la QMainWindowde la escena directamente y bypass mediante el QWidgetque la contenía, entonces todo funciona bien. El ajuste funciona sin problemas compensados y no hay más accidentes. Debido a esta interacción estoy casi convencido de que es un error Qt y desearía presentar un informe de error usando este post como base. Si me falta algo o la necesidad de actualizar los controladores de mis gráficos, lo haré. Sin embargo, no explica por qué el chasquido no coincide con la QMainWindow'scolocación del rectángulo banda de goma cuando se está arrastrando.

Publicado el 07/11/2018 a las 22:38
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
0

La solución a este extraño problema es análogo a mi otro post con respecto a los menús de contexto dentro de un QGraphicsScene. Para solucionar este comportamiento, sólo tiene que establecer el setWindowFlags(Qt::BypassGraphicsProxyWidget)ya sea en el control de ventana padre o la propia sub-MainWindow. Si lo haces en el widget padre, que va implícita aplicarlo al QMainWindow. Cada vez que parece que hay un problema en una QGraphicsScene, estableciendo que la bandera anterior parece resolver la mayoría de los bugs / problemas.

Respondida el 20/11/2018 a las 15:51
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more