简体   繁体   中英

set widget from keypress event

I'm trying set a widget when I press space key. I have a QGridLayout that contain QLabel's. I want to set text of a specific Qlabel from your coord in the QGridLayout, but when I access to QGridLayout from my keypress function, the variable is null.

import sys
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import QMainWindow, QLabel, QGridLayout, QWidget
from PyQt5.QtCore import QSize    

class Position:
   def __init__(self, x, y):
      self.x = x
      self.y = y

class HelloWindow(QMainWindow):
    global gridLayout
    def __init__(self):
        QMainWindow.__init__(self)

        self.setMinimumSize(QSize(640, 640))    
        self.setWindowTitle("Hello world") 

        centralWidget = QWidget(self)          
        self.setCentralWidget(centralWidget)   

        gridLayout = QGridLayout(self)
        gridLayout.setSpacing(0)  
        centralWidget.setLayout(gridLayout)  

        file_text = open("logic/file.txt", "r")
        file = file_text.read()
        file = file.replace("[(","")
        file = file.replace(")]","")
        file = file.replace("),(",";")
        positions = file.split(';')
        lista = []
        for pos in positions:
         coord = pos.split(',')
         temp = Position(int(coord[0]),int(coord[1]))
         lista.append(temp)
        file_text.close()

        cont = 0
        for x in range(0, 9):
         for y in range(0, 9):
            if cont < 64:
               title = QLabel(str(cont+1), self) 
               title.setAlignment(QtCore.Qt.AlignCenter)
               title.setContentsMargins(0,0,0,0)
               title.setStyleSheet('QLabel {background-color: white; color: red; font-size: 24px; font-weight: bold}')
               if cont%2 == 0:
                  title.setStyleSheet('QLabel {background-color: black; color: red; font-size: 24px; font-weight: bold}')
               gridLayout.addWidget(title,lista[cont].x,lista[cont].y)
               cont += 1

    def keyPressEvent(self, event):
      if event.key() == QtCore.Qt.Key_Escape:
         self.close()
      if event.key() == QtCore.Qt.Key_Space:
         item = gridLayout.itemAtPosition(1,1)
         w = item.widget()
         w.setText("test")

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    mainWin = HelloWindow()
    mainWin.show()
    sys.exit( app.exec_() )

The next section is a test

def keyPressEvent(self, event):
      if event.key() == QtCore.Qt.Key_Escape:
         self.close()
      if event.key() == QtCore.Qt.Key_Space:
         item = gridLayout.itemAtPosition(1,1)
         w = item.widget()
         w.setText("test")

I access to widget from your coord for set your text.

The problem arises from the misuse of the global variable, this has to be declared every time you use it, in your case:

class HelloWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        [...]
        global gridLayout
        gridLayout = QGridLayout(self)
        [...]

    def keyPressEvent(self, event):
      if event.key() == QtCore.Qt.Key_Escape:
         self.close()
      if event.key() == QtCore.Qt.Key_Space:
        global gridLayout
        item = gridLayout.itemAtPosition(1, 1)
        w = item.widget()
        w.setText("test")

A more elegant solution is to declare gridLayout as an attribute of the class, for this you must change gridLayout to self.gridLayout in all cases:

class Position:
   def __init__(self, x, y):
      self.x = x
      self.y = y

class HelloWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)

        self.setMinimumSize(QSize(640, 640))    
        self.setWindowTitle("Hello world") 

        centralWidget = QWidget(self)          
        self.setCentralWidget(centralWidget)   
        self.gridLayout = QGridLayout(self)
        self.gridLayout.setSpacing(0)  
        centralWidget.setLayout(self.gridLayout)  

        file_text = open("logic/file.txt", "r")
        file = file_text.read()
        file = file.replace("[(", "")
        file = file.replace(")]", "")
        file = file.replace("),(", ";")
        positions = file.split(';')
        lista = []
        for pos in positions:
            coord = pos.split(',')
            temp = Position(int(coord[0]), int(coord[1]))
            lista.append(temp)
        file_text.close()

        cont = 0
        for x in range(0, 9):
            for y in range(0, 9):
                if cont < 64:
                    title = QLabel(str(cont+1), self) 
                    title.setAlignment(QtCore.Qt.AlignCenter)
                    title.setContentsMargins(0, 0, 0, 0)
                    title.setStyleSheet('QLabel {background-color: white; color: red; font-size: 24px; font-weight: bold}')
                    if cont%2 == 0:
                       title.setStyleSheet('QLabel {background-color: black; color: red; font-size: 24px; font-weight: bold}')
                    self.gridLayout.addWidget(title, lista[cont].x, lista[cont].y)
                    cont += 1

    def keyPressEvent(self, event):
        if event.key() == QtCore.Qt.Key_Escape:
            self.close()
        if event.key() == QtCore.Qt.Key_Space:
            item = self.gridLayout.itemAtPosition(1, 1)
            w = item.widget()
            w.setText("test")

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    mainWin = HelloWindow()
    mainWin.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