繁体   English   中英

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

[英]Python PyQt button click won't fire a event

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

在此处输入图片说明

在此处输入图片说明

问题在于self.buttonf.clicked.connect(...) 此调用将一个函数附加到按钮上的“单击”操作。 该函数在没有参数的情况下被调用,并且返回值被简单地丢弃。 在您的情况下, lambda: self.get_text是一个函数, lambda: self.get_text返回self.get_text方法的地址。 由于get_text不需要任何额外的参数,因此您可以将其直接绑定到此插槽。

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

稍后您还会遇到需要调用 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_()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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