我正在用Python创建我的第一个应用程序。目前,我正在使用PyQt5和MVC模式实现第一个视图。因此,我创建了一个“main”类,它通过创建新的控制器对象(我学习的第一种编程语言是Java,所以可能这不是必要的)来启动控制器。在这个控制器对象的init方法中,我正在创建第一个视图。视图类本身创建一个新的QWidget。在创建QWidget后,控制器调用了视图(QWidget)的一个方法。该方法应该显示登录屏幕。为了显示登录屏幕,创建了一个新类(Login)。该类是QVBoxLayout类型,并添加到主视图(QWidget)。这种组合导致一个显示带有登录窗口的应用程序。这意味着主类-> 控制器->主窗口(QWidget)->登录(QVBoxLayout)。
对于这点我有以下疑问:创建主窗口(QWidget)并使用方法将内部布局添加到窗口(使用其他文件/类)是正确的方式吗?还是应该在一个类中编写所有内容?
现在我已经达到了布局和窗口正确显示的地步。缺少的是模型以及如何调用模型。我搜索了如何检查按钮是否被按下。我找到了button.clicked.connect(callfunction)。这似乎是正确的方法,但是如何从控制器调用此函数呢?因此,控制器创建应用程序窗口并在其中显示登录。然后控制器侦听并等待按钮被按下。然后将输入转发到模型中,并在模型中检查凭据。以下是我的控制器源代码以及尝试侦听按钮:
对于这点我有以下疑问:创建主窗口(QWidget)并使用方法将内部布局添加到窗口(使用其他文件/类)是正确的方式吗?还是应该在一个类中编写所有内容?
现在我已经达到了布局和窗口正确显示的地步。缺少的是模型以及如何调用模型。我搜索了如何检查按钮是否被按下。我找到了button.clicked.connect(callfunction)。这似乎是正确的方法,但是如何从控制器调用此函数呢?因此,控制器创建应用程序窗口并在其中显示登录。然后控制器侦听并等待按钮被按下。然后将输入转发到模型中,并在模型中检查凭据。以下是我的控制器源代码以及尝试侦听按钮:
class Controller(object):
def __init__(self):
# Applikation starten und Login anzeigen
app = QApplication(sys.argv)
widget = View()
widget.showLogin(0, "")
widget.loginButton.clicked.connect(self.loginPressed())
sys.exit(app.exec_())
def loginPressed(self):
widget.showLogin(1, "err1")
我的登录类代码:
def __init__(self):
super().__init__()
# Zum vertikalen zentrieren des Inhalts
self.addStretch()
# Label (Bild) erstellen und zum Layout hinzufügen
label = QLabel()
pixmap = QPixmap(pathLogo)
label.setPixmap(pixmap.scaledToWidth(logoWidth, Qt.SmoothTransformation))
label.setAlignment(Qt.AlignCenter)
self.addWidget(label)
# Label für den Nutzername
usernameLabel = QLabel("Username")
usernameLabel.setAlignment(Qt.AlignCenter)
usernameLabel.setStyleSheet("QLabel {color: #ffffff; font-size: 14px; font-weight:bold; "
"margin:50px, 0, 5px, 0 ;}")
self.addWidget(usernameLabel)
# Eingabefeld für den Nutzername
uihbox = QHBoxLayout()
uihbox.addStretch()
usernameInput = QLineEdit()
usernameInput.setFixedWidth(150)
usernameInput.setStyleSheet(
"QLineEdit {border-radius: 5px; padding: 4px; line-height:12px; padding-left: 5px;}")
uihbox.addWidget(usernameInput)
uihbox.addStretch()
self.addLayout(uihbox)
# Label für das Passwort
passwortLabel = QLabel("Passwort")
passwortLabel.setAlignment(Qt.AlignCenter)
passwortLabel.setStyleSheet("QLabel {color: #ffffff; font-size: 14px; font-weight:bold; "
"margin:15px, 0, 5px, 0 ;}")
self.addWidget(passwortLabel)
# Eingabefeld für den Nutzername
pihbox = QHBoxLayout()
pihbox.addStretch()
passwordInput = QLineEdit()
passwordInput.setFixedWidth(150)
passwordInput.setEchoMode(QLineEdit.Password)
passwordInput.setStyleSheet(
"QLineEdit {border-radius: 5px; padding: 4px; line-height:12px; padding-left: 5px;}")
pihbox.addWidget(passwordInput)
pihbox.addStretch()
self.addLayout(pihbox)
# Button erstellen
bihbox = QHBoxLayout()
bihbox.addStretch()
loginButton = QPushButton("Login")
loginButton.setStyleSheet("QPushButton {margin: 25px, 0, 0, 0; border-radius:5px; border: 1px solid white; "
"padding-right: 15px; padding-left: 15px; padding-top: 5px; padding-bottom:5px;"
"color:white; font-weight:bold; font-size: 14px;}")
loginButton.setCursor(QCursor(Qt.PointingHandCursor))
bihbox.addWidget(loginButton)
bihbox.addStretch()
self.addLayout(bihbox)
# Zum vertikalen zentrieren des Inhalts
self.addStretch()
def showError(self, errCode):
errMsg = QLabel(err1)
errMsg.setAlignment(Qt.AlignCenter)
errMsg.setStyleSheet("QLabel {color:red;}")
self.addWidget(errMsg)
self.addStretch()
我的View类:
class View(QWidget):
# Methode um das Fenster der Applikation zu initialisieren
def __init__(self):
super().__init__()
# Breite und Höhe setzen
self.resize(initWidth, initHeight)
# Titel und Icon setzen
self.setWindowTitle(appTitle)
self.setWindowIcon(QIcon(pathFavicon))
# Hintergrund mit der bgColor füllen
self.setAutoFillBackground(True)
p = self.palette()
p.setColor(self.backgroundRole(), QColor(bgColor))
self.setPalette(p)
# Anzeigen des Fensters
self.show()
# Methode, um Login zu zeigen
def showLogin(self, err, errcode):
# Laden des Inhalts mittels Login
if (err != 0):
vbox = Login()
vbox.showError(errcode)
if (err == 0):
vbox = Login()
self.setLayout(vbox)
更多问题:
- 我对MVC模式的理解正确吗?我使用了太多类吗?
- 在控制器中应该监听按钮,还是视图调用控制器中的方法是正确的?
- 此外,我实现了一个功能,可以通过错误代码调用登录
QVBoxLayout
以在视图底部显示错误。我没有找到一种从控制器类动态更改视图的方法。我唯一能想象的解决方案是“重绘”QWidget
的内容并添加错误消息。这是正确的解决方案吗?
提前谢谢!
widget.loginButton.clicked.connect(self.loginPressed())
更改为widget.loginButton.clicked.connect(self.loginPressed)
,去掉()
。 - eyllanescLogin
类完整代码。 - eyllanesc