Кнопка PyQt не отображается - PullRequest
0 голосов
/ 27 сентября 2018

Итак ... Я использую PyQt lib для python, чтобы создать класс Graphics, который абстрагирует большинство функций класса QtGui. Я буду использовать его позже для других моих проектов. Похоже, это работаетхорошо, за исключением того, что кнопка и другие виджеты не отображаются, хотя окно создается.

import sys
from PyQt4 import QtGui

class Graphics:
    def __init__(self):

        self.app=QtGui.QApplication(sys.argv)
        self.widgets={}
        self.labels={}
        self.buttons={}


    def getApp(self):

        return self.app


    def newWidget(self,name:str):

        self.widgets[name]=QtGui.QWidget()
        return self.widgets[name]       


    def addButton(self,name:str,text:str):

        self.buttons[name]=QtGui.QPushButton(text)
        return self.buttons[name]


    def addLabel(self,name:str,text:str):

        self.labels[name]=QtGui.QLabel()
        self.labels[name].setText(text)
        return self.labels[name]


    def start(self):
        for widget in self.widgets:
            self.widgets[widget].show()
        sys.exit(self.app.exec_())

^ Вот код. Ниже показано, как я реализую класс

from graphics import Graphics

gui=Graphics()
w1=gui.newWidget("hmm")
bt1=gui.addButton("hey","hello")
print(bt1)
gui.start()

Было бы замечательно, если бы вы смогли дать представление о том, почему это происходит. Спасибо

1 Ответ

0 голосов
/ 27 сентября 2018

В Qt есть основное правило: дочерние элементы QWidget отрисовываются относительно родительского элемента QWidget, и если у него нет родительского элемента, это будет окно, которое называется верхним уровнем.

Другая концепция QPushButton, QLabel, QSpinBox и т. Д. QWidgets, поскольку они наследуются от этого класса.

Итак, поскольку QPushButton не имеет родителя,он должен показать себя как окно, и для этого вы должны использовать show():

def start(self):
    [w.show() for name, w in self.widgets.items()]
    [button.show() for name, button in self.buttons.items()]
    [label.show() for name, label in self.labels.items()]

    sys.exit(self.app.exec_())

enter image description here


Если ваше намерение таковонекоторые QLabel или QPushButton являются частью некоторых QWidget, тогда мы должны указать этот виджет как родительский, например, в моем следующем решении я предлагаю добавить имя виджета, и если виджет не существует, он должен бытьсозданный:

import sys
from PyQt4 import QtGui

class Graphics:
    def __init__(self):
        self.app=QtGui.QApplication(sys.argv)
        self.widgets={}
        self.labels={}
        self.buttons={}

    def getApp(self):
        return self.app

    def newWidget(self, name:str):
        w = QtGui.QWidget()
        self.widgets[name] = w
        return w     

    def addButton(self, widget_name:str, name:str, text:str):
        if widget_name in self.widgets:
            w = self.widgets[widget_name]
        else:
            w = self.newWidget(widget_name)
        button = QtGui.QPushButton(text, parent=w)
        self.buttons[name] = button
        return button

    def addLabel(self, widget_name:str, name:str, text:str):
        if widget_name in self.widgets:
            w = self.widgets[widget_name]
        else:
            w = self.newWidget(widget_name)
        label = QtGui.QLabel(text, parent=w)
        self.labels[name] = label
        return label

    def start(self):
        [w.show() for name, w in self.widgets.items()]

        sys.exit(self.app.exec_())

enter image description here


Если вы хотите добавить родителя после создания кнопки, вы можете использовать setParent():

graphics.py

import sys
from PyQt4 import QtGui

class Graphics:
    def __init__(self):
        self.app=QtGui.QApplication(sys.argv)
        self.widgets={}
        self.labels={}
        self.buttons={}

    def getApp(self):
        return self.app

    def newWidget(self, name:str):
        w = QtGui.QWidget()
        self.widgets[name] = w
        return w     

    def addButton(self, name:str, text:str):
        button = QtGui.QPushButton(text)
        self.buttons[name] = button
        return button

    def addLabel(self, name:str, text:str):
        label = QtGui.QLabel(text)
        self.labels[name] = label
        return label

    def start(self):
        for _, w in in self.widgets.items():
            w.show()
        sys.exit(self.app.exec_())

main.py

gui=Graphics()
w1 = gui.newWidget("hmm")
bt1 = gui.addButton("hey","hello")
bt1.setParent(w1) # <-- set w1 as parent of bt1
gui.start()
...