【问题标题】:How can I add a label widget after the main window has been initialized?初始化主窗口后如何添加标签小部件?
【发布时间】:2022-01-09 02:26:55
【问题描述】:

我想在MainWindow 初始化后添加一个标签小部件。如果我在MainWindow 中调用该函数但不是从另一个函数调用该函数,它工作正常,该函数已执行,但不会将新标签添加到窗口。

QtWidgets.QMainWindow.__init__(self)
    self.ui = Ui_MainWindow()
    self.ui.setupUi(self)
    self.setWindowFlag(QtCore.Qt.FramelessWindowHint)
    self.shadow = QGraphicsDropShadowEffect(self)
    self.shadow.setBlurRadius(50)
    self.shadow.setXOffset(0)
    self.shadow.setYOffset(0)
    self.ui.centralwidget.setGraphicsEffect(self.shadow)
    self.setWindowTitle(" NetView ")
    # QSizeGrip(self.ui.size_grip)
    self.ui.minimizeBtn.clicked.connect(lambda: self.showMinimized())
    self.ui.resmaxBtn.clicked.connect(lambda: self.restore_or_maximize_window())
    self.ui.closeBtn.clicked.connect(lambda: self.close())
    self.ui.lockBtn.clicked.connect(lambda: self.netLock())
    self.ui.unlockBtn.clicked.connect(lambda: self.unLock())

    ## works fine
    self.createNewWidget(0,0,"test")

def createNewWidget(self, rowNumber, columNumber, client_name):
    new_label_name = 'label_'+client_name
    #print(new_label_name)
    self.label_new = QtWidgets.QLabel(self.ui.scrollAreaWidgetContents)
    self.label_new.setMinimumSize(QtCore.QSize(200, 150))
    self.label_new.setMaximumSize(QtCore.QSize(200, 150))
    #self.label_new.setStyleSheet("background-color:rgb(255,85,255);")
    self.label_new.setFrameShape(QtWidgets.QFrame.StyledPanel)
    self.label_new.setFrameShadow(QtWidgets.QFrame.Raised)
    self.label_new.setObjectName(new_label_name)

def createdisplay(self)
    ##does not work
    self.createNewWidget(0,1,"test1")

【问题讨论】:

  • 添加self.label_new.show()理论上可以解决问题,但真正的问题是您应该实际使用layout managers
  • 谢谢,不过没用,加在createNewWidget和ceatedisplay函数的最后。
  • 如前所述,您应该使用布局管理器。

标签: python pyqt


【解决方案1】:

这是我最近创建的一个极其简单的 GUI 示例,应该会给你答案:

Qlabel 是你最应该关注的 :)

class Window(QMainWindow): 

    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi()
        
    def setupUi(self):
        self.setWindowTitle("Server Checker")
        self.resize(300, 400)
        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget)
        # Create and connect widgets
        self.textOutput = QPlainTextEdit(self)
        self.textOutput.setReadOnly(True)
        self.textOutput.resize(280, 300)
        self.textOutput.move(10, 5)

        self.serversCheckedtoScreen = QLabel("Servers Checked: ", self)
        self.serversCheckedtoScreen.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter)

        self.serversFailed = QLabel("Total Servers Offline: 0", self)
        self.serversFailed.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
        
        self.pbar = QProgressBar(self, objectName="progressBar")  
        self.pbar.setGeometry(200, 80, 280, 20)
        self.pbar.setValue(0)
        
        self.pbar.setMinimum(0)
        self.countBtn = QPushButton("Check Servers", self)
        self.countBtn.clicked.connect(self.onButtonClick)
        # Set the layout
        layout = QVBoxLayout()
        layout.addWidget(self.textOutput)
        layout.addWidget(self.serversCheckedtoScreen)
        layout.addWidget(self.serversFailed)
        layout.addWidget(self.pbar)
        layout.addWidget(self.countBtn)

        self.pbar.setStyleSheet("""
        QWidget {
            text-align: center;
            }
        """)
        self.centralWidget.setLayout(layout)

它创建一个小窗口的实例,带有一个输出区域、两个标签和一个进度条。它还使用布局管理器。从技术上讲,缺少一个 .show(),但是我主要有那段代码,因此这里缺少它。

【讨论】:

  • 感谢您的帮助,但我不确定我做错了什么。我使用 QT 设计器创建了窗口,并且工作正常,我要做的就是通过调用另一个函数向主窗口添加一个标签。如果我有一个按钮来执行该功能,它就可以正常工作。
  • 试过用自己称呼这个:def createdisplay(self) ##does not work createNewWidget(0,1,"test1")self.createNewWidget(0,1,"test1")
  • 抱歉没用,函数执行了,但是没有给窗口添加新标签。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多