【问题标题】:PyQt5 create Qlablels dynamically from another py filePyQt5 从另一个 py 文件动态创建 Qlablels
【发布时间】:2021-12-12 06:21:51
【问题描述】:

我正在尝试使用 Qt Designer 在 pycharm 中开发桌面应用程序。 所以我从设计师那里提取了一个带有我所有界面的 main_ui.py 文件

# -*- coding: utf-8 -*-

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.setWindowModality(QtCore.Qt.ApplicationModal)
        MainWindow.resize(1404, 792)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
        MainWindow.setSizePolicy(sizePolicy)
        MainWindow.setFocusPolicy(QtCore.Qt.StrongFocus)
        MainWindow.setLayoutDirection(QtCore.Qt.LeftToRight)
        MainWindow.setAutoFillBackground(False)
        MainWindow.setStyleSheet("")
        MainWindow.setAnimated(False)
        MainWindow.setTabShape(QtWidgets.QTabWidget.Rounded)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.main_fm = QtWidgets.QFrame(self.centralwidget)
        self.main_fm.setGeometry(QtCore.QRect(310, -10, 1071, 800))
        self.main_fm.setStyleSheet("background-color: \"#116466\"")
        self.main_fm.setFrameShape(QtWidgets.QFrame.NoFrame)
        self.main_fm.setFrameShadow(QtWidgets.QFrame.Plain)
        self.main_fm.setObjectName("main_fm")
        self.maintoolbar_fm = QtWidgets.QFrame(self.main_fm)
        self.maintoolbar_fm.setGeometry(QtCore.QRect(0, 0, 1061, 35))
        self.maintoolbar_fm.setLayoutDirection(QtCore.Qt.RightToLeft)
        self.maintoolbar_fm.setStyleSheet("background-color: \"#116466\";")
        self.maintoolbar_fm.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.maintoolbar_fm.setFrameShadow(QtWidgets.QFrame.Raised)
        self.maintoolbar_fm.setObjectName("maintoolbar_fm")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.maintoolbar_fm)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.main_exit2_btn = QtWidgets.QPushButton(self.maintoolbar_fm)
        self.main_exit2_btn.setFocusPolicy(QtCore.Qt.NoFocus)
        self.main_exit2_btn.setStyleSheet("")
        self.main_exit2_btn.setText("")
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("icons/exit.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.main_exit2_btn.setIcon(icon)
        self.main_exit2_btn.setFlat(True)
        self.main_exit2_btn.setObjectName("main_exit2_btn")
        self.horizontalLayout.addWidget(self.main_exit2_btn)
        self.minim2_btn = QtWidgets.QPushButton(self.maintoolbar_fm)
        self.minim2_btn.setFocusPolicy(QtCore.Qt.NoFocus)
        self.minim2_btn.setStyleSheet("")
        self.minim2_btn.setText("")            
        self.members_bt.setIcon(icon9)
        self.members_bt.setIconSize(QtCore.QSize(45, 40))
        self.members_bt.setFlat(True)
        self.members_bt.setObjectName("members_bt")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        self.stackedWidget.setCurrentIndex(0)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "ΑΞΙΟΝ ΠΕΙΡΑΙΑ"))
        self.title_date.setText(_translate("MainWindow", "Todaydate"))
        self.author_lb.setText(_translate("MainWindow", "David Dan"))
        self.sum_oplo.setText(_translate("MainWindow", "0"))
        self.sum_members_lb_4.setText(_translate("MainWindow", "Οπλομαχία:"))
        self.sum_fencing.setText(_translate("MainWindow", "0"))
        self.sum_members_lb_3.setText(_translate("MainWindow", "Ξιφασκια:"))
        self.sum_tkd.setText(_translate("MainWindow", "0"))
        self.sum_members_lb_2.setText(_translate("MainWindow", "Taekwon-Do:"))
        self.sum_members.setText(_translate("MainWindow", "0"))
        self.sum_members_lb.setText(_translate("MainWindow", "Σύνολο:"))
        self.sum_oplo_pre.setText(_translate("MainWindow", "0"))
        self.oplo_pres_lb.setText(_translate("MainWindow", "Οπλομαχία:"))
        self.sum_fencing_pre.setText(_translate("MainWindow", "0"))
        self.fencing_pres_lb.setText(_translate("MainWindow", "Ξιφασκια:"))
        self.sum_tkd_pre.setText(_translate("MainWindow", "0"))
        self.tae_pre_lb.setText(_translate("MainWindow", "Taekwon-Do:"))
        self.sum_pres.setText(_translate("MainWindow", "0"))
        self.sum_pres_lb.setText(_translate("MainWindow", "Σύνολο:"))
        self.title_members_lb.setText(_translate("MainWindow", "Μέλη"))
        self.title_present_lb.setText(_translate("MainWindow", "Παρουσίες Σήμερα"))
        self.title_eco_lb.setText(_translate("MainWindow", "Οικονομικά"))
        self.expe_eco_lb.setText(_translate("MainWindow", "0"))
        self.exp_eco_title_lb.setText(_translate("MainWindow", "Έξοδα:"))
        self.oplo_eco_lb.setText(_translate("MainWindow", "0"))
        self.oplo_eco_title_lb.setText(_translate("MainWindow", "Οπλομαχία:"))
        

我还有一个运行所有代码的 main.py 文件。 在该文件中,我从我的谷歌日历中检索数据,并且我想为每个事件动态创建 QLabels。

这是我的 main.py 示例:

import datetime
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
from PyQt5.QtCore import Qt, QRect, QPropertyAnimation, QParallelAnimationGroup, QDate
from PyQt5 import QtGui, QtWidgets

from login_main import Ui_MainWindow
import google_calendar
import sys
import login_query

class LoginWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        global buttons_style
        buttons_style = "QToolTip { background-color: black } QPushButton { border-left: 5px solid #88b1b2; border-radius: 13px 0px 0px 13px; background-color: #116466} "
        global widgets
        widgets = self.ui
        global start_pos_x
        start_pos_x = 150
        global start_pro_y
        start_pro_y = 150
        self.baseHeight = 369
        self.extendedHeight = 400
        self.rect = QRect(start_pos_x, start_pro_y, 320, self.baseHeight)
        self.setGeometry(self.rect)
        # this will hide the title bar
        self.setWindowFlag(Qt.FramelessWindowHint)
        widgets.toggle_bt.clicked.connect(self.buttonClick)
        widgets.home_bt.clicked.connect(self.buttonClick)
        widgets.taek_bt.clicked.connect(self.buttonClick)
        widgets.fencing_bt.clicked.connect(self.buttonClick)
        widgets.oplo_bt.clicked.connect(self.buttonClick)
        widgets.eco_bt.clicked.connect(self.buttonClick)
        widgets.prese_bt.clicked.connect(self.buttonClick)
        widgets.members_bt.clicked.connect(self.buttonClick)
        ####################################################
        widgets.login_btn.clicked.connect(self.pressed)
        ####################################################
        widgets.main_exit_btn.clicked.connect(self.close) 
        widgets.minim_btn.clicked.connect(self.showMinimized)  
        ####################################################
        widgets.main_exit2_btn.clicked.connect(self.close)  
        widgets.minim2_btn.clicked.connect(self.showMinimized)  
        ####################################################
        self.installEventFilter(self)
        self.displayTime()
        widgets.toolBar_fm.hide()
        self.show()

    def displayTime(self):
        now = QDate.currentDate()
        widgets.title_date.setText(now.toString(Qt.DefaultLocaleLongDate))

    def buttonClick(self):
        # GET BUTTON CLICKED
        btn = self.sender()
        btnName = btn.objectName()
        #################

    def pressed(self):
        if (widgets.user_tb.text() == "" or widgets.user_tb.text() == "Username") and (
                widgets.pass_tb.text() == "" or widgets.pass_tb.text() == "Password"):
            widgets.info_lb.setText("No username and password")
            print("No username and password inserted")
        ####################################

    def refresh_calendar(self):
        calendar_list = google_calendar.calendar_data.main(self)
        if calendar_list[0] == "empty":
            print("No Calendar Events")
            widgets.calendar_error_lb.setText("No Calendar Events")
        else:
            print("Calendar List:")
            print(calendar_list)
            print("Each Item:")
            for item in calendar_list:
                dayWeek = datetime.datetime.strptime(item[0], '%d-%m-%Y').strftime('%A')
                print(item[0], dayWeek, item[1], item[2], item[3])
                 HERE I WANT TO CREATE A LABEL FOR EACH ELEMENT IN calendar_list according the week day in my main window
                if dayWeek == 'Monday':
                    pass
                elif dayWeek == 'Tuesday':
                    pass
                elif dayWeek == 'Wednesday':
                    pass
                elif dayWeek == 'Thursday':
                    pass
                elif dayWeek == 'Friday':
                    pass
                #friday_fm
                elif dayWeek == 'Saturday':
                    pass
                elif dayWeek == 'Saturday':
                    pass
            print("##################### END of Calendar event List ##############################")

    def refresh_stats(self):
        # MEMBERS STATS
        members_array = login_query.connection.login_members_stats(self, widgets.user_tb.text(), widgets.pass_tb.text())
        widgets.sum_members.setText(str(members_array[0]))
        widgets.sum_tkd.setText(str(members_array[1]))
        widgets.sum_fencing.setText(str(members_array[2]))
        widgets.sum_oplo.setText(str(members_array[3]))
       

    def keyPressEvent(self, qKeyEvent):  # αναγνωριζει τα enter και καλει την συναρτηση οταν πατιεται το login button
        print(qKeyEvent.key())
        if qKeyEvent.key() == Qt.Key_Return or qKeyEvent.key() == Qt.Key_Enter:
            self.pressed()
            print('Enter pressed')

    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.offset = event.pos()
        else:
            super().mousePressEvent(event)

    def mouseMoveEvent(self, event):
        if self.offset is not None and event.buttons() == Qt.LeftButton:
            self.move(self.pos() + event.pos() - self.offset)
        else:
            super().mouseMoveEvent(event)

    def mouseReleaseEvent(self, event):
        self.offset = None
        super().mouseReleaseEvent(event)


def resetStyle(self, btnName):
    for w in self.ui.toolBar_fm.findChildren(QPushButton):
        if w.objectName() != btnName:
            w.setStyleSheet("")
    print("resetStyle")


# Create the application object
if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = LoginWindow()
    sys.exit(app.exec_())

所以问题是如何在主窗口(和 Qframe 内部)中创建/添加标签而不在 main_ui.py 中添加代码。

请提前。

【问题讨论】:

  • 创建一个布局并向其中添加小部件,然后将布局设置为self.ui.main_fm

标签: python pyqt5 qt-designer


【解决方案1】:

非常感谢@ekhumoro 布局就是答案……太简单了。

layout1 = QGridLayout()
item1 = QLabel(item[3])
item2 = QLabel(item[1])
layout1.addWidget(item1)
layout1.addWidget(item2)
widgets.friday_fm.setLayout(layout1)

【讨论】:

  • 但是我无法对布局中的小部件进行排序,因为使用垂直、水平、网格或表单布局它们会自动排序。我以为我可以使用垫片,但动态执行它非常复杂。有什么想法???
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-30
  • 2016-12-21
  • 1970-01-01
相关资源
最近更新 更多