简体   繁体   中英

Opening new Window having grid layout in Pyqt5

I know this question has been asked many times but every time i see different case .

1st problem:

I can't open new window (Window2) having grid layout.

I am trying to open a new window (Window2) in pyqt , this window(Window2) has grid layout .

To make grid layout work , Window2 has parent(QWidget)

and to make it open Window2 has another parent(QMainWindow)

but those two parents conflict each other means:

on having QWidget only as a parent ,Window2 doesn't open at all

on having QMainWindow only as a parent ,Window2 opens but with no grid layout

on having both as parents ,Window2 opens but with no grid layout

and i don't know how to open the window correctly while still having the grid layout

Edit: i have found question about multiple inheritance but i couldn't understand how it works Multiple inheritance

2nd problem:

i am having a global variable numberofholes which value is changed in the class "Window" and is used then in the class "Window2"

so this variable is changed in class"Window" correctly , but is either not defined or its value is not changed in the class "Window2" so how is the value being global not defined in the class"Window2"

Part of the Code:

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()

Try it:

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_())

在此处输入图片说明

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM