【问题标题】:Connect QListWidgetItem in setupUI [duplicate]在 setupUI 中连接 QListWidgetItem [重复]
【发布时间】:2019-06-19 19:48:18
【问题描述】:

我想将文件拖放到listwidget,当itemactivatedplaintextedit 打开并且文件中的readAll 行时。但返回错误:"connect() failed between itemActivated(QListWidgetItem*) and read_txt()"

from PyQt5 import QtCore, QtGui, QtWidgets
import sys


class Ui_MainWindow(object):

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(873, 663)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        MainWindow.setCentralWidget(self.centralwidget)

        self.listWidget = listWidget(self.centralwidget)
        self.listWidget.setGeometry(QtCore.QRect(150, 330, 256, 192))
        self.listWidget.setObjectName("listWidget")

        self.plainTextEdit = QtWidgets.QPlainTextEdit(self.centralwidget)
        self.plainTextEdit.setGeometry(QtCore.QRect(440, 200, 104, 87))
        self.plainTextEdit.setObjectName("plainTextEdit")

        self.listWidget.itemActivated.connect(self.read_txt)

        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    @QtCore.pyqtSlot("QListWidgetItem*")
    def read_txt(self,links):

        file = QtCore.QFile(links.text())
        if file.open(QtCore.QFile.ReadOnly | QtCore.QFile.Text):
            self.plainTextEdit.setPlainText(file.readAll().data().decode())            
class listWidget(QtWidgets.QListWidget):
    def __init__(self, parent):
        super().__init__(parent)   
        self.setAcceptDrops(True)

    def dragEnterEvent(self, event):

        if event.mimeData().hasUrls:

            event.acceptProposedAction()
        else:
            event.ignore() 

    def dragMoveEvent(self, event):
        if event.mimeData().hasUrls:
            event.setDropAction(QtCore.Qt.CopyAction)
            event.acceptProposedAction()
        else:
            event.ignore()
    def dropEvent(self, event):

        if event.mimeData().hasUrls:
            event.setDropAction(QtCore.Qt.CopyAction)

            for url in event.mimeData().urls():
                links=QtWidgets.QListWidgetItem(url.toLocalFile())

            self.addItem(links)
            event.acceptProposedAction()   


if __name__ == "__main__":


    if not QtWidgets.QApplication.instance():
        app = QtWidgets.QApplication(sys.argv)
    else:
        app = QtWidgets.QApplication.instance() 



    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    app.exec_() 

拖放工作正常,但无法将QListWidgetItemsetupUi 中的readtxt 方法连接起来。有什么问题??

【问题讨论】:

    标签: python-3.x pyqt5


    【解决方案1】:

    问题是@pyqtSlot 装饰器只能在继承自QObject 的类中使用。您可以将信号连接到任何可调用对象,因此最简单的方法是省略装饰器,但如果出于某种原因确实需要它,您可以继承 QMainWindow 并在其中定义插槽,例如

    class MyMainWindow(QtWidgets.QMainWindow):
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            self.ui = Ui_MainWindow()
            self.ui.setupUi(self)
            self.ui.listWidget.itemActivated.connect(self.read_txt)
    
        @QtCore.pyqtSlot("QListWidgetItem*")
        def read_txt(self, links):
            file = QtCore.QFile(links.text())
            if file.open(QtCore.QFile.ReadOnly | QtCore.QFile.Text):
                self.ui.plainTextEdit.setPlainText(file.readAll().data().decode())
    
    
    if __name__ == '__main__':
        ...
        mainWindow = MyMainWindow()
        mainWindow.show()
        ...
    

    【讨论】:

    猜你喜欢
    • 2011-08-07
    • 2014-12-08
    • 2015-12-29
    • 2012-06-18
    • 2016-06-04
    • 2021-02-05
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多