Открытие нового окна с разметкой сетки в Pyqt5 - PullRequest
1 голос
/ 25 апреля 2019

Я знаю, что этот вопрос задавался много раз, но каждый раз, когда я вижу другой случай.

1-я проблема:

Я не могу открыть новое окно (Window2) с разметкой сетки.

Я пытаюсь открыть новое окно (Window2) в pyqt, это окно (Window2) имеет разметку сетки.

Чтобы сделать разметку сетки, Window2 имеет родителя (QWidget)

и чтобы открыть его, в Window2 есть другой родитель (QMainWindow)

, но эти два родителя конфликтуют друг с другом, значит:

при наличии QWidget только в качестве родителя, Window2не открывается вообще

при наличии QMainWindow только в качестве родителя, Window2 открывается, но без разметки сетки

при наличии обоих в качестве родителей, Window2 открывается, но без разметки сетки

и я не знаю, как правильно открыть окно, сохраняя макет сетки

Редактировать: я нашел вопрос о множественном наследовании, но я не мог понять, как оно работает Многократное наследование

2ая проблема:

у меня глобальная переменная numberofholes, значение которой изменяется в классе "Window" и затем используется в классе "Window2"

, поэтому эта переменная изменяетсяв классе "Window" правильно, но либо не определено, либо его значение не изменено в классе "Window2", так как глобальное значение не определено в классе "Window2"

ЧастьКод:

import sys
from PyQt5 import QtWidgets, QtGui, QtCore

from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

#######global variables#####################################
global memorysize
global numberofholes
####################################################################
class Window(QWidget):
    def __init__(self,parent=None):
        super(Window,self).__init__(parent)
        self.setWindowTitle("Memory")
        self.setGeometry(50,50,500,300)
        self.home()



    def home(self):

        self.grid=QGridLayout()
        self.setLayout(self.grid)

        self.memory=QLabel(self)
        self.memory.setText("Total Memory size")
        self.grid.addWidget(self.memory,0,0)

        self.memoryinput=QLineEdit(self)
        self.grid.addWidget(self.memoryinput,0,20)

        self.holes=QLabel(self)
        self.holes.setText("Number of holes")
        self.grid.addWidget(self.holes,5,0)

        self.inputholes=QLineEdit(self)
        self.grid.addWidget(self.inputholes,5,20)

        self.submit=QPushButton("OK",self)
        self.grid.addWidget(self.submit,10,0)

#################Action on clicking submit###########################
        self.submit.clicked.connect(self.getholes)
    def getholes(self):
        memorysize=float(self.memoryinput.text())
        numberofholes=int(self.inputholes.text())
        self.close()
        self.window2=Window2(self)

##############second window for holes input##########################
class Window2(QMainWindow,QWidget):
    def __init__(self,parent=None):
        super().__init__(parent)
        self.setWindowTitle("Memory")
        self.setGeometry(50,50,500,300)
        self.home()
        self.show()
    def home(self):
        self.grid=QGridLayout()
        self.setLayout(self.grid)
        #print(numberofholes)

        for n in range (numberofholes):
            self.start_add=QLabel(self)
            self.start_add.setText("Starting Address")

            self.inputstart=QLineEdit(self)

            self.size=QLabel(self)
            self.size.setText("Size")

            self.inputsize=QLineEdit(self)

            self.grid.addWidget(self.start_add,2*n+1,0)
            self.grid.addWidget(self.inputstart,2*n+1,1)
            self.grid.addWidget(self.size,2*n+1,2)
            self.grid.addWidget(self.inputsize,2*n+1,3)

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


if __name__ == '__main__':
    main()

1 Ответ

0 голосов
/ 25 апреля 2019

Попробуйте:

import sys
from PyQt5 import QtWidgets, QtGui, QtCore
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

### global variables 
# global memorysize                                          # ---
# global numberofholes                                       # ---
###        


class Window(QWidget):
    def __init__(self,parent=None):
        super(Window,self).__init__(parent)
        self.setWindowTitle("Memory 1")
        self.setGeometry(50, 50, 500, 300)
        self.home()

    def home(self):
        self.grid = QGridLayout()
        self.setLayout(self.grid)

        self.memory = QLabel(self)
        self.memory.setText("Total Memory size")
        self.grid.addWidget(self.memory, 0, 0)

        self.memoryinput = QLineEdit(self)
        self.grid.addWidget(self.memoryinput, 0, 20)

        self.holes = QLabel(self)
        self.holes.setText("Number of holes")
        self.grid.addWidget(self.holes, 5, 0)

        self.inputholes = QLineEdit(self)
        self.grid.addWidget(self.inputholes, 5, 20)

        self.submit = QPushButton("OK", self)
        self.grid.addWidget(self.submit, 10, 0)

        #       Action on clicking submit                 
        self.submit.clicked.connect(self.getholes)

    def getholes(self):
        memorysize    = float(self.memoryinput.text())
        numberofholes = int(self.inputholes.text())
        self.hide()                                             # --- close()
        self.window2 = Window2(memorysize, numberofholes)       # --- self
        self.window2.show()


#     second window for holes input    
class Window2(QWidget):                                         # --- QMainWindow,
    def __init__(self, memorysize, numberofholes, parent=None):
        super().__init__(parent)

        self.memorysize, self.numberofholes = memorysize, numberofholes
        print("memorysize=`{}`,\nnumberofholes=`{}`".format(self.memorysize, self.numberofholes))

        self.setWindowTitle("Memory 2")
        self.setGeometry(50,50,500,300)
        self.home()
        self.show()

    def home(self):
        self.grid = QGridLayout()
        self.setLayout(self.grid)
        print(self.numberofholes)

        for n in range (2):
            self.start_add = QLabel(self)
            self.start_add.setText("Starting Address")

            self.inputstart = QLineEdit(self)

            self.size = QLabel(self)
            self.size.setText("Size")

            self.inputsize = QLineEdit(self)

            self.grid.addWidget(self.start_add, 2*n+1, 0)
            self.grid.addWidget(self.inputstart,2*n+1, 1)
            self.grid.addWidget(self.size,      2*n+1, 2)
            self.grid.addWidget(self.inputsize, 2*n+1, 3)

if __name__ == '__main__':
     app = QApplication(sys.argv)
     main = Window()
     main.show()
     sys.exit(app.exec_())

enter image description here

...