如何处理PyQt4中的布局?

时间:2015-10-15 15:48:27

标签: python python-3.x pyqt4

我想在框架中间显示欢迎标签,我该怎么做?看起来像布局问题,因为我用Google搜索,但我还没有最终的解决方案。

以下是代码:

import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *

class Window(QMainWindow):
        def __init__(self):
                super(Window, self).__init__()
                palette = QPalette()
                palette.setBrush(QPalette.Background, QBrush(QPixmap("Login page.jpg")))
                self.setPalette(palette)
                self.setWindowTitle("Login Frame")
                self.setWindowIcon(QIcon('logo.png'))
                self.setGeometry(50, 50, 500, 300)
                self.setFixedSize(500, 300)
                self.addWidgets()

        def addWidgets(self):
                self.lblWelcome = QLabel("Welcome to Railway e-Ticketing System", self)
                self.lblWelcome.move(100,30)
                wcFont = QFont("Open Sans", 25)
                self.lblWelcome.setFont(wcFont)

                self.lblUid = QLabel("User ID:", self)
                self.lblUid.move(100,80)

                font = QFont("Open Sans", 10)
                self.lneUid = QLineEdit(self)
                self.lneUid.setFont(font)
                self.lneUid.setFixedHeight(25)
                self.lneUid.setFixedWidth(200)
                self.lneUid.move(225, 80)


                self.lblPass = QLabel("Password:", self)
                self.lblPass.move(100, 130)

                self.lnePass = QLineEdit(self)
                self.lnePass.setEchoMode(QLineEdit.Password)
                self.lnePass.setFixedHeight(25)  
                self.lnePass.setFixedWidth(200)
                self.lnePass.move(225, 130)

                self.lblInvalid = QLabel("",self)
                self.lblInvalid.move(100, 180)

                self.btnLogin = QPushButton("Login",self)
                #btnLogin.resize(btnLogin.sizeHint())
                self.btnLogin.move(175, 230)
                self.btnLogin.clicked.connect(self.authenticate)
                #self.authenticate()

                self.btnReg = QPushButton("Register", self)
                self.btnReg.move(300, 230)
                #btnReg.clicked.connect(register)

                self.show()

        def authenticate(self):
                uid = self.lneUid.text()
                upass = self.lnePass.text()
                if(len(uid.strip()) == 0 or len(upass.strip()) == 0):
                        palette = QPalette()
                        palette.setColor(QPalette.Foreground, Qt.darkRed)
                        self.lblInvalid.setPalette(palette)
                        self.lblInvalid.setText("*Invalid credentials .")
                else:
                        self.lblInvalid.setText("")





def main():
        app = QApplication(sys.argv)
        LoginWin = Window()
        sys.exit(app.exec_())


if __name__ == "__main__":
        main()

这是输出:

enter image description here

1 个答案:

答案 0 :(得分:0)

您正在使用QMainWindow already has a layout,其中包含中央窗口小部件,工具栏,菜单栏等。使用它的正确方法是定义中央窗口小部件,并放置所有标签和按钮在里面。你没有,所以你的标签显示不正确。

但是对于您的登录框架,您显然不需要所有这些。您只需要一个QWidget

import sys
from PyQt4 import QtCore,QtGui  

class LoginFrame(QtGui.QWidget):
    def __init__(self):
        super(LoginFrame, self).__init__()
        ...

if __name__=='__main__':
    app = QtGui.QApplication(sys.argv)
    win = LoginFrame()
    win.show()
    sys.exit(app.exec_())

您的代码应该与QWidget一起使用,但我仍然建议阅读有关框布局的内容。现在,您正在使用绝对定位,这意味着您必须手动将小部件放置在精确位置,并且无法调整窗口大小。

盒子布局会更灵活,更实用。例如,您可以使用QFormLayout作为用户ID和密码。

有关ZetCode tutorial

上的布局的详情