Saya menulis kode ini dan saya tidak mengerti mengapa widget QLabel dan QLineEdit tidak muncul? Apakah saya harus menempatkan mereka di kelas lain? Ini Python2.7 dan PySide.

Ini adalah tampilan jendela ketika saya menjalankan kode:

enter image description here

#!/usr/bin/env python
# coding: utf-8

import sys
import crypt
from PySide import QtGui

class MyApp(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MyApp, self).__init__(parent)
        self.initui()

    def initui(self):
        # main window size, title and icon
        self.setMinimumSize(500, 350)
        self.setWindowTitle("Calculate a password hash in Linux")

        # lines for entering data
        self.saltLabel = QtGui.QLabel("Salt:")
        self.saltLine = QtGui.QLineEdit()
        self.saltLine.setPlaceholderText("e.g. $6$xxxxxxxx")

        # set layout
        grid = QtGui.QGridLayout()
        grid.addWidget(self.saltLabel, 0, 0)
        grid.addWidget(self.saltLine, 1, 0)

        self.setLayout(grid)

        # show a widget
        self.show()

def main():
    app = QtGui.QApplication(sys.argv)
    instance = MyApp()
    instance.show()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()
-1
Hrvoje T 24 Mei 2016, 11:14
Anda tidak memerlukan QMainWindow. Anda harus menggunakan QDialog atau QWidget.
 – 
Kuba hasn't forgotten Monica
24 Mei 2016, 16:15

1 menjawab

Jawaban Terbaik

Bagaimana kalau menggunakan QWidget sebagai centralWidget

widget = QWidget()
widget.setLayout(grid)
#add your widgets and...
self.setCentralWidget(widget)

Dan Anda tidak perlu memanggil show() karena Anda melakukannya di __main__

Terserah pemiliknya, tetapi saya akan merekomendasikan sublasasi QWidget dan biarkan instance QMainWindow Anda sesingkat mungkin. Sebuah implementasi dapat berupa:

class MyWidget(QtGui.QWidget):

    def __init__(self, *args):
        QtGui.QWidget.__init__(self, *args)
        grid = QtGui.QGridLayout()
        #and so on...

Dan gunakan ini sebagai widget dalam instance QMainWindow Anda. Ini sangat meningkatkan keterbacaan dan pemeliharaan dan dapat digunakan kembali :)

2
tobilocker 24 Mei 2016, 11:40
Ok, ketika saya melakukan itu (sendiri bukan ini), widget memang muncul tetapi di sudut kiri atas, satu di atas yang lain. Namun, saya mengganti QMainWindow dengan QWidget dan sekarang tidak masalah. Terima kasih!
 – 
Hrvoje T
24 Mei 2016, 11:38
1
Apakah Anda mencoba jawaban yang diperbarui? setCentralWidget harus mengisi instance QMainWindow Anda. Terus perbarui saya jika Anda tidak ingin contoh atas berfungsi. Saya dapat memberikan jawaban yang lebih rinci juga.
 – 
tobilocker
24 Mei 2016, 11:45
Saya menyimpan QMainWindow, menambahkan widget QLabel dan QLineEdit di grid dan mengatur widget sebagai centrawidged di QMainWindow. Ini bekerja, terima kasih!
 – 
Hrvoje T
24 Mei 2016, 12:16