Python PyQt按钮单击不会触发事件

2024-09-28 22:37:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我是PyQt的新手,但我有一个无法解决的问题。我试图从第二个窗口获取文本并将其设置为字段,所以当我关闭第二个窗口时,我可以从第一个主窗口打印文本,但我的“另一个窗口”按钮不会触发事件,我真的不知道为什么?这是代码。有人能指引我吗? 谢谢

class AnotherWindow(QMainWindow):


    def __init__(self):
        super().__init__()
        self.resize(1200, 600)
        self.text = "basetext"

        self.layoutf = QFormLayout()
        self.buttonf = QPushButton("get text")
        self.buttonf.clicked.connect(lambda: self.getText)

        self.line = QLineEdit()
        self.layoutf.addRow(self.buttonf,self.line)


        self.widgetf = QWidget()
        self.widgetf.setLayout(self.layoutf)

        self.setCentralWidget(self.widgetf)

    def getText(self):
        print(self.line.text)
        self.text = self.line.text
        self.close()



class MainWindow(QMainWindow):

    def __init__(self):
        super().__init__()
        self.w = None  # No external window yet.


        self.mainLayout = QGridLayout()

        self.button = QPushButton("Push for Window")
        self.button.clicked.connect(self.show_new_window)

        self.button1 = QPushButton("Push ")
        self.button1.clicked.connect(self.printFromSecondWindow)

        self.mainLayout.addWidget(self.button,0,0)
        self.mainLayout.addWidget(self.button1, 0, 1)

        self.widget = QWidget()
        self.widget.setLayout(self.mainLayout)

        self.setCentralWidget(self.widget)


    def show_new_window(self):
        if self.w is None:
            self.w = AnotherWindow()
            self.w.show()

        else:
            self.w.close()  # Close window.
            self.w = None  # Discard reference.

    def printFromSecondWindow(self):
        print(self.w.text)


    app = QApplication(sys.argv)
    w = MainWindow()
    w.show()
    app.exec_()

Tags: textselfnoneinitdefshowconnectline
2条回答
  1. 在主窗口构造函数中实例化第二个窗口一次self.w = AnotherWindow (self)
  2. 当创建第二个窗口的实例时,self.w = AnotherWindow (self)-self作为父窗口传递,这样当主窗口关闭时,第二个窗口也会关闭
  3. 要从QLineEdit小部件获取文本,请使用QString text() const,更多https://doc.qt.io/qt-5/qlineedit.html#text-prop
  4. 您没有显示方法printFromSecondWindow,据我所知,在该方法中,您希望显示您想要显示的内容

试试看:

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


class AnotherWindow(QMainWindow):
    def __init__(self, parent=None):
        super(AnotherWindow, self).__init__(parent)
        self.widgetf = QWidget()
        self.setCentralWidget(self.widgetf)        
        
#        self.resize(1200, 600)
        self.text = "basetext"

        self.layoutf = QFormLayout(self.widgetf)
        self.buttonf = QPushButton("get text")
#        self.buttonf.clicked.connect(lambda: self.getText)       # ??? lambda
        self.buttonf.clicked.connect(self.getText)
        
        self.line = QLineEdit()
        self.layoutf.addRow(self.buttonf,self.line)

    def getText(self):
        print(self.line.text())                                   # !   .text()
        self.text = self.line.text()                              # !   .text() 
        self.close()
        
        
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.widget = QWidget()
        self.setCentralWidget(self.widget)
# ?        self.w = None  # No external window yet.

        self.button = QPushButton("Push for Window")
        self.button.clicked.connect(self.show_new_window)
        self.button1 = QPushButton("Push ")
        self.button1.clicked.connect(self.printFromSecondWindow)
        
        self.mainLayout = QGridLayout(self.widget)
        self.mainLayout.addWidget(self.button, 0, 0)
        self.mainLayout.addWidget(self.button1, 0, 1)

        self.w = AnotherWindow(self)                                # +++ 

    def show_new_window(self):
#        if self.w is None:
#            self.w = AnotherWindow()
        self.w.show()                                 # !
#        else:
#            self.w.close()  # Close window.
#            self.w = None  # Discard reference.

    def printFromSecondWindow(self):                                 # +++
        print(self.w.text)
            

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

enter image description here

enter image description here

问题在于self.buttonf.clicked.connect(...)。此调用将函数附加到按钮上的“单击”操作。调用函数时不带参数,返回值被简单地丢弃。在您的例子中,lambda: self.get_text是一个只返回self.get_text方法地址的函数。因为get_text不需要任何额外的参数,所以可以将它直接绑定到此插槽

self.buttonf.clicked.connect(self.get_text)

稍后还出现了一个bug,需要调用text方法。有了这两个变化,工作程序就完成了

import sys
from PyQt5 import QtWidgets, QtCore, QtGui
from PyQt5.Qt import *
    
class AnotherWindow(QMainWindow):

    def __init__(self):
        super().__init__()
        self.resize(1200, 600)
        self.text = "basetext"

        self.layoutf = QFormLayout()
        self.buttonf = QPushButton("get text")
        self.buttonf.clicked.connect(self.getText)

        self.line = QLineEdit()
        self.layoutf.addRow(self.buttonf,self.line)

        self.widgetf = QWidget()
        self.widgetf.setLayout(self.layoutf)

        self.setCentralWidget(self.widgetf)

    def getText(self):
        print("the info", self.line.text())
        self.text = self.line.text()
        self.close()


class MainWindow(QMainWindow):

    def __init__(self):
        super().__init__()
        self.w = None  # No external window yet.

        self.mainLayout = QGridLayout()

        self.button = QPushButton("Push for Window")
        self.button.clicked.connect(self.show_new_window)

        self.button1 = QPushButton("Push ")
        self.button1.clicked.connect(self.printFromSecondWindow)

        self.mainLayout.addWidget(self.button,0,0)
        self.mainLayout.addWidget(self.button1, 0, 1)

        self.widget = QWidget()
        self.widget.setLayout(self.mainLayout)

        self.setCentralWidget(self.widget)

    def show_new_window(self):
        if self.w is None:
            self.w = AnotherWindow()
            self.w.show()

        else:
            self.w.close()  # Close window.
            self.w = None  # Discard reference.

    def printFromSecondWindow(self):
        print(self.w.text)


app = QApplication(sys.argv)
w = MainWindow()
w.show()
app.exec_()

相关问题 更多 >