2013-01-23 21 views
12

Sto caricando una base QMainWIndow da un file * .ui. Inoltre, ho un widget personalizzato che voglio posizionare da qualche parte sul modulo. Attualmente ho messo nel file .ui un vuoto QVBoxLayout nome placeholder, e nella sottoclasse QMainWindow faccio self.placeholder.addWidget(my_custom_widget)Segnaposto per un widget personalizzato

L'unica cosa che non mi piace in questo approccio è che il layout vuoto non dispone di un proprio formato. Posso avere un layout con una cella e con un oggetto fittizio (QLabel per esempio) con la dimensione che voglio, e sostituire questo widget e quindi aggiungere il mio widget personalizzato, ma il metodo sembra troppo per me.

Qual è il tuo approccio per tale compito?

Sto usando Python (PyQt4)

risposta

24

Ecco un piccolo tutorial facile su come promuovere un widget:

  1. Fare clic destro sul widget che si intende utilizzare come segnaposto e selezionare promuovere per ....

    Image Promote

  2. riempimento nel Promosso Clases campi di dialogo pop-up:
    • Base Class Nome: QWidget in questo caso.
    • Promosso Nome classe: Il nome della classe è stato utilizzato per definire il widget di per il quale si sta creando il segnaposto, qui è MyWidget
    • intestazione del file: /path/to/MyWidget.py è il percorso del file in cui è inserito MyWidget. Image Path
  3. Una volta cliccato Aggiungere, la classe viene creato e visualizzato, selezionarlo e fare clic Promote. Hai finito di promuovere. Image Add
  4. Ecco cosa si dovrebbe vedere nella vostra oggetto Inspector pannello, il nome della classe non è più QWidget, è MyWidget invece.

    Image Promoted

  5. Nel file a /path/to/MyWidget.py Ho una classe di nome MyWidget, e il contenuto è qualcosa di simile:

    #!/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, grazie per una vasta risposta! – warvariuc

+3

Solo una piccola osservazione: almeno durante la mia installazione, il percorso completo del file alla libreria non funzionava. Ho dovuto cambiarlo in un'importazione in stile python e dopo ha funzionato alla grande! – OBu

3

Si dovrebbe mettere un QWidget nel QtDesigner e poi promuoverlo al vostro widget personalizzato. Per ulteriori dettagli, consultare questo link: http://doc.qt.digia.com/qt/designer-using-custom-widgets.html

Un'altra opzione potrebbe essere quella di creare un plug-in QtDesigner per il widget, ma ciò sarebbe utile solo se è necessario inserirlo in più interfacce.

2

Beh, non avere una soluzione migliore, per ora, ho finito con un QVBoxLayout con una cella con un distanziale in esso:

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) 
Problemi correlati