2013-01-23 14 views
12

Ich lade eine QMainWIndow-Basis aus einer * .ui-Datei. Außerdem habe ich ein benutzerdefiniertes Widget, das ich irgendwo auf dem Formular platzieren möchte. Derzeit setzen i in der .ui Datei eine leere QVBoxLayout namens placeholder, und in der QMainWindow Unterklasse tun self.placeholder.addWidget(my_custom_widget)Platzhalter für ein benutzerdefiniertes Widget

Das einzige, was ich in diesem Ansatz nicht mag ist, dass der leere Layout nicht seine eigene Größe hat. Ich kann ein Layout mit einer Zelle und mit einem Dummy-Widget (QLabel zum Beispiel) mit der Größe, die ich will, und ersetzen Sie dieses Widget und dann mein eigenes Widget hinzufügen, aber die Methode scheint zu viel für mich.

Was ist Ihr Ansatz für eine solche Aufgabe?

Ich bin mit Python (PyQt4)

Antwort

24

Hier ist ein einfaches, kleines Tutorial, wie man fördern ein Widget:

  1. Rechts auf das Widget klicken Sie als Platzhalter verwenden wollen, und wählen Sie fördern ....

    Image Promote

  2. Füllen Sie das Promoted Clases Popup-Dialogfelder:
    • Basisklassenname: QWidget in diesem Fall.
    • Klassenname Promoted: Der Klassenname Sie das Widget definieren verwendet, für die Sie den Platzhalter erstellen, hier ist es MyWidget
    • Header-Datei: /path/to/MyWidget.py ist die Pfad zu der Datei, in der MyWidget platziert ist. Image Path
  3. Sobald Sie auf Hinzufügen klicken, wird die Klasse erstellt und angezeigt wird, wählen Sie es aus und Promote klicken. Du bist fertig mit der Werbung. Image Add
  4. Hier ist, was Sie in Ihrem Objektinspektor Panel, der Name der Klasse ist nicht mehr QWidget sehen sollte, dann ist es MyWidget statt.

    Image Promoted

  5. In der Datei auf /path/to/MyWidget.py habe ich eine Klasse MyWidget genannt, und der Inhalt ist so etwas wie diese:

    #!/usr/bin/env python 
    #-*- coding:utf-8 -*- 
    
    from PyQt4 import QtGui 
    
    class MyWidget(QtGui.QWidget): 
        def __init__(self, parent=None): 
         super(MyWidget, self).__init__(parent) 
    
         self.labelHello = QtGui.QLabel(self) 
         self.labelHello.setText("This is My Widget") 
    
         self.layout = QtGui.QHBoxLayout(self) 
         self.layout.addWidget(self.labelHello) 
    
+1

Wow, danke für eine umfassende Antwort! – warvariuc

+3

Nur eine kleine Bemerkung: Zumindest bei meiner Installation funktionierte der vollständige Dateipfad zur Bibliothek nicht. Ich musste es in einen Python Style Import umwandeln und danach hat es super geklappt! – OBu

3

Sie ein QWidget im QtDesigner legen sollten und es dann auf Ihre individuelle Widget fördern. Weitere Informationen finden Sie unter folgendem Link: http://doc.qt.digia.com/qt/designer-using-custom-widgets.html

Eine andere Option wäre, ein QtDesigner-Plugin für Ihr Widget zu erstellen, aber dies wäre nur nützlich, wenn Sie es in mehrere Benutzer einfügen müssen.

2

Na ja, nicht eine bessere Lösung für die jetzt mit, landete ich in es mit einem Abstandhalter mit einer Zelle mit einem QVBoxLayout bis:

enter image description here

FormClass, BaseClass = uic.loadUiType('main_window.ui') 
assert BaseClass is QtGui.QMainWindow 


class MainWindow(QtGui.QMainWindow, FormClass): 

    def __init__(self): 
     super().__init__() 

     # uic adds a function to our class called setupUi 
     # calling this creates all the widgets from the .ui file 
     self.setupUi(self) 

     # my custom widget 
     self.web_view = WebView(self, WebPage(self, self.print_to_console)) 
     # replace placeholder with our widget 
     self.placeholder_layout.takeAt(0) # remove placeholder spacer 
     # and replace it with our widget 
     self.placeholder_layout.addWidget(self.web_view) 
Verwandte Themen