2015-06-09 5 views
1

Я пытаюсь создать окно с текстовым вводом & поле со списком. На данный момент я просто хочу увидеть текст &, который отображается под соответствующим виджетами.PyQt QVBoxLayout и отсутствующие виджеты?

Я использовал QVBoxLayout(), поскольку я буду добавлять больше материала позже & думал, что это будет простой способ выложить окно.

К сожалению, показывается только поле со списком. Код:

from PyQt4 import QtCore, QtGui 
import sys 

class Polyhedra(QtGui.QMainWindow): 

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

     self.initUI() 

    def initUI(self): 

     # Poly names 
     self.pNames = QtGui.QLabel(self)    
     polyNameInput = QtGui.QLineEdit(self) 
     # polyName entry 
     polyNameInput.textChanged[str].connect(self.onChanged) 

     # Polytype selection 
     self.defaultPolyType = QtGui.QLabel("Random polyhedra", self) 
     polyType = QtGui.QComboBox(self) 
     polyType.addItem("Random polyhedra") 
     polyType.addItem("Spheres") 
     polyType.addItem("Waterman polyhedra") 
     polyType.activated[str].connect(self.onActivated) 

     # Layout 
     vbox = QtGui.QVBoxLayout() 
     vbox.addWidget(polyNameInput) 
     vbox.addWidget(self.pNames) 
     vbox.addWidget(polyType) 
     vbox.addWidget(self.defaultPolyType) 
     vbox.addStretch() 

     # Set up window   
     self.setGeometry(500, 500, 300, 300) 
     self.setWindowTitle('Pyticle') 
     self.show() 

    # Combo box 
    def onActivated(self, text): 

     self.defaultPolyType.setText(text) 
     self.defaultPolyType.adjustSize() 

    # Poly names   
    def onChanged(self, text): 

     self.pNames.setText(text) 
     self.pNames.adjustSize() 

def main(): 

    app = QtGui.QApplication(sys.argv) 
    ex = Polyhedra() 
    sys.exit(app.exec_()) 


if __name__ == '__main__': 
    main() 

Так что происходит здесь? Не хватает ли какой-либо важной директивы для QVBoxLayout()?

Использование Python 2.7 на Win 7 x64 машине с PyQt 4.

EDIT: Дополнительные проблемы (по-прежнему связан с отсутствующими виджетами)

Я исправленный код по следующему осветлению. Затем я добавил больше виджетов, когда выбран какой-либо параметр в combobox (см. Ниже), но эти виджеты не отображаются. Я попытался добавить дочерний виджет к «виджету» под названием «ranPolyWidget» для ввода числового ввода.

# Combo box 
def onActivated(self, text): 

    if text=="Random polyhedra": 
     self.randomSeedLbl = QtGui.QLabel("Seed: ", self)    
     randomSeed = QtGui.QLineEdit(self) 
     randomSeed.textChanged[str].connect(self.setSeed) 
     ranPolyWidget = QtGui.QWidget(self.widget) 
     rbox = QtGui.QVBoxLayout(ranPolyWidget) 
     rbox.addWidget(randomSeed) 
     self.layout().addWidget(ranPolyWidget) 
     self.show() 
    else: 
     self.defaultPolyType.setText(text) 
     self.defaultPolyType.adjustSize() 

Такая же проблема, как и раньше, без виджетов. Мне не хватает чего-то довольно фундаментального аранта?

ответ

1

Вы забыли установить его в виджет или в главное окно, так как QComboBox является последним, он отображается только один. В принципе, все добавлено в макет, но макет «свободно плавающий», и поэтому он не отображается должным образом. Вам нужно привязать макет к QWidget, который я здесь делаю. Для большинства виджетов вы можете сделать это с помощью QtGui.QVBoxLayout (widget) или widget.setLayout (макет).

В качестве альтернативы, если вы хотите несколько макетов в виджетах, вы можете иметь родительский макет, а затем добавить каждый макет ребенка в основной макет.

EDIT: Это лучший ответ:

сделать виджет, установить макет в виджете и установить в качестве центрального виджета.

QMainWindow-s не нравится, когда вы используете встроенный макет или переопределяете его.

widget = QtGui.QWidget() 
vbox = QtGui.QVBoxLayout(widget) 
self.setCentralWidget(widget) 

Старый Ответ:.

self.layout() addLayout (VBox).

Это должно исправить проблему:

изменения я сделал: Поскольку QMainWindow уже есть макет, добавить в виджет (28G), а затем установите VBoxLayout в виджет и добавить его в главное окно.

from PyQt4 import QtCore, QtGui 
import sys 

class Polyhedra(QtGui.QMainWindow): 

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

     self.initUI() 

    def initUI(self): 

     # Poly names 
     self.pNames = QtGui.QLabel(self)    
     polyNameInput = QtGui.QLineEdit(self) 
     # polyName entry 
     polyNameInput.textChanged[str].connect(self.onChanged) 

     # Polytype selection 
     self.defaultPolyType = QtGui.QLabel("Random polyhedra", self) 
     polyType = QtGui.QComboBox(self) 
     polyType.addItem("Random polyhedra") 
     polyType.addItem("Spheres") 
     polyType.addItem("Waterman polyhedra") 
     polyType.activated[str].connect(self.onActivated) 

     # Layout 
     widget = QtGui.QWidget() 
     vbox = QtGui.QVBoxLayout(widget) 
     vbox.addWidget(polyNameInput) 
     vbox.addWidget(self.pNames) 
     vbox.addWidget(polyType) 
     vbox.addWidget(self.defaultPolyType) 
     vbox.addStretch() 

     # Set up window   
     self.setGeometry(500, 500, 300, 300) 
     self.setWindowTitle('Pyticle') 
     self.layout().addWidget(widget) 
     self.show() 

    # Combo box 
    def onActivated(self, text): 

     self.defaultPolyType.setText(text) 
     self.defaultPolyType.adjustSize() 

    # Poly names   
    def onChanged(self, text): 

     self.pNames.setText(text) 
     self.pNames.adjustSize() 

def main(): 

    app = QtGui.QApplication(sys.argv) 
    ex = Polyhedra() 
    sys.exit(app.exec_()) 


if __name__ == '__main__': 
    main() 

EDIT:

Для добавления новых виджетов, вы должны добавить их в расположение центрального виджета и родитель их этот виджет.

Вот как я бы реструктурировать свой полный код:

from PyQt4 import QtCore, QtGui 
import sys 

class CentralWidget(QtGui.QWidget): 

    def __init__(self, parent=None): 
     super(CentralWidget, self).__init__(parent) 

     # set layouts 
     self.layout = QtGui.QVBoxLayout(self) 
     # Poly names 
     self.pNames = QtGui.QLabel(self)    
     polyNameInput = QtGui.QLineEdit(self) 
     # polyName entry 
     polyNameInput.textChanged[str].connect(self.onChanged) 

     # Polytype selection 
     self.defaultPolyType = QtGui.QLabel("Random polyhedra", self) 
     polyType = QtGui.QComboBox(self) 
     polyType.addItem("Random polyhedra") 
     polyType.addItem("Spheres") 
     polyType.addItem("Waterman polyhedra") 
     polyType.activated[str].connect(self.onActivated) 

     self.layout.addWidget(polyNameInput) 
     self.layout.addWidget(self.pNames) 
     self.layout.addWidget(polyType) 
     self.layout.addWidget(self.defaultPolyType) 
     self.layout.addStretch() 

    def onActivated(self, text): 
     '''Adds randSeed to layout''' 

     if text=="Random polyhedra": 
      self.randomSeedLbl = QtGui.QLabel("Seed: ", self)    
      randomSeed = QtGui.QLineEdit(self) 
      randomSeed.textChanged[str].connect(self.setSeed) 
      self.layout.addWidget(randomSeed) 
     else: 
      self.defaultPolyType.setText(text) 
      self.defaultPolyType.adjustSize() 

    # Poly names   
    def onChanged(self, text): 

     self.pNames.setText(text) 
     self.pNames.adjustSize() 

class Polyhedra(QtGui.QMainWindow): 
    def __init__(self): 
     super(Polyhedra, self).__init__() 

     # I like having class attributes bound in __init__ 
     # Not very Qt of me, but it's more 
     # so I break everything down into subclasses 
     # find it more Pythonic and easier to debug: parent->child 
     # is easy when I need to repaint or delete child widgets 
     self.central_widget = CentralWidget(self) 
     self.setCentralWidget(self.central_widget) 

     # Set up window   
     self.setGeometry(500, 500, 300, 300) 
     self.setWindowTitle('Pyticle') 
     self.show() 

    # Combo box 
    def onActivated(self, text): 
     '''Pass to child''' 

     self.central_widget.onActivated(text) 

def main(): 

    app = QtGui.QApplication(sys.argv) 
    ex = Polyhedra() 
    sys.exit(app.exec_()) 


if __name__ == '__main__': 
    main() 
+0

Спасибо, что работает, но я получаю следующее сообщение в консоли Python, «QMainWindowLayout :: AddItem: Пожалуйста, используйте QMainWindow API общественности вместо " Означает ли это, что QT не нравится создание дочерних виджетов в QMainWindow? – DrBwts

+0

Это означает, что вам не нравится, когда вы используете встроенный макет для QMainWindow. Обычно для QMainWindow, вы должны сделать это: виджет = QtGui.QWidget (Я) # родитель это self.setCentralWidget (виджет) –

+1

Обновленный мой ответ, чтобы сделать его лучше для QMainWindow. –

Смежные вопросы