2017-10-30 3 views
1

Im folgenden Code sind die oberen Widgets QTextEdit und QGraphicsView nicht ausgerichtet, wenn QHBoxLayout verwendet wird. Wenn Sie jedoch QTextEdit auskommentieren und das andere QGraphicsView-Setup auskommentieren, werden die oberen Rand der Widgets perfekt ausgerichtet. Hier sind meine Fragen:Zusammenführen der Side-by-Side-Widgets mit PySide

  1. Was verursacht dieses Alignment Problem auftreten und wie kann es behoben werden?

  2. Werden Probleme wie diese am besten mit Qt Creator vermieden?

  3. Ist die gesamte QGraphicsView() -> QGraphicsScene() -> QWidget() erforderlich, um Grafiken neben anderen Widgets zu platzieren?

import sys 
from PySide.QtCore import * 
from PySide.QtGui import * 


class Widget(QWidget): 
    def __init__(self, parent=None): 
     super(Widget, self).__init__() 

     # Create Widget1 
     widget1 = QTextEdit() 
     #widget1 = QWidget() 
     #view1 = QGraphicsView() 
     #scene1 = QGraphicsScene(0,0,200,500) 
     #view1.setScene(scene1) 
     #layout = QHBoxLayout() 
     #layout.addWidget(view1) 
     #widget1.setLayout(layout) 


     # Create Widget2 
     widget2 = QWidget() 
     view2 = QGraphicsView() 
     scene2 = QGraphicsScene(0,0,200,500) 
     view2.setScene(scene2) 
     layout = QHBoxLayout() 
     layout.addWidget(view2) 
     widget2.setLayout(layout) 


     # Layout of Side by Side windows 
     container = QWidget() 
     layout = QHBoxLayout() 
     layout.addWidget(widget1) 
     layout.addWidget(widget2) 
     container.setLayout(layout) 

     # Scroll Area Properties 
     scroll = QScrollArea() 
     scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn) 
     scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) 
     scroll.setWidgetResizable(False) 
     scroll.setWidget(container) 

     # Scroll Area Layer add 
     vLayout = QVBoxLayout(self) 
     vLayout.addWidget(scroll) 
     self.setLayout(vLayout) 


if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    dialog = Widget() 
    dialog.show() 
    app.exec_() 

Antwort

0

Die Layouts haben eine Standard-Marge. Wenn sich also ein Widget in einem Layout befindet und sein Nachbar nicht, werden sie nicht ausgerichtet. Um den Standard-Marge zu entfernen, können Sie dies tun:

layout = QHBoxLayout() 
    layout.setContentsMargins(0, 0, 0, 0) 

jedoch in Ihrem Beispiel der Container-Widget und Layout für die QGraphicsView nicht etwas Nützliches zu tun. So könnte man die, und zusammen mit einigen anderen Vereinfachungen, kommt zu diesem entfernen:

class Widget(QWidget): 
    def __init__(self, parent=None): 
     super(Widget, self).__init__() 

     widget1 = QTextEdit() 
     widget2 = QGraphicsView() 
     widget2.setScene(QGraphicsScene(0, 0, 200, 500, widget2)) 

     container = QWidget() 
     layout = QHBoxLayout(container) 
     layout.addWidget(widget1) 
     layout.addWidget(widget2) 

     scroll = QScrollArea() 
     scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn) 
     scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) 
     scroll.setWidgetResizable(False) 
     scroll.setWidget(container) 

     vLayout = QVBoxLayout(self) 
     vLayout.addWidget(scroll) 

Mit Qt Designer sicherlich sehr nützlich sind, wenn sie mit den Layouts einer komplexen Anwendung experimentieren. Der Code, den er erzeugt, ist jedoch normalerweise ziemlich ausführlich im Vergleich zu dem, was Sie beim manuellen Codieren erreichen können. Für eine langfristige Wartbarkeit scheint jedoch die Verwendung von Qt Designer die beste Option zu sein.

+0

Vielen Dank. Klar und prägnant. –