使用Pyqt中的按钮框触发事件两次

时间:2017-04-30 17:49:18

标签: python drag-and-drop pyqt qt-designer

这个应用程序是一个基本的Drag'n'Drop程序,应该处理掉落的.html文件。

到目前为止,我已经编写了这段代码:

main.py

from PyQt4 import QtGui 
import sys
import design, os

class MyTextEdit(QtGui.QTextEdit):

    def __init__(self, parent):
        super(MyTextEdit, self).__init__(parent)
        self.setAcceptDrops(True)
        self.list_of_dropped_files = []

    def dragEnterEvent(self, event):
        if event.mimeData().hasUrls():
            event.accept()
        else:
            event.ignore()

    def dragMoveEvent(self, event):
        event.accept()

    def dropEvent(self, event):

        self.clear()

        self.list_of_dropped_files = event.mimeData().urls()

        for single_file in self.list_of_dropped_files:
            self.append(single_file.toLocalFile())


class DialogInit(QtGui.QDialog, design.Ui_Dialog):
    def __init__(self):
        super(self.__class__, self).__init__()
        self.setupUi(self)

        self.buttonBox.accepted.connect(self.accept) # handle the ok button click
        self.textEditHandler = MyTextEdit(self.textEdit)

    def accept(self):
        print self.textEditHandler.list_of_dropped_files


def main():
    app = QtGui.QApplication(sys.argv)  
    form = DialogInit()                 
    form.show()                         
    app.exec_()                         


if __name__ == '__main__':             
    main()                              

我还使用QtDesigner创建了一个design.py代码,如下所示:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'untitled.ui'
#
# Created by: PyQt4 UI code generator 4.11.4
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName(_fromUtf8("Dialog"))
        Dialog.resize(409, 80)
        self.verticalLayoutWidget = QtGui.QWidget(Dialog)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(0, 0, 401, 71))
        self.verticalLayoutWidget.setObjectName(_fromUtf8("verticalLayoutWidget"))
        self.verticalLayout = QtGui.QVBoxLayout(self.verticalLayoutWidget)
        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
        self.horizontalLayout = QtGui.QHBoxLayout()
        self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
        self.label = QtGui.QLabel(self.verticalLayoutWidget)
        font = QtGui.QFont()
        font.setPointSize(12)
        self.label.setFont(font)
        self.label.setObjectName(_fromUtf8("label"))
        self.horizontalLayout.addWidget(self.label)
        self.textEdit = QtGui.QTextEdit(self.verticalLayoutWidget)
        self.textEdit.setAcceptDrops(True)
        self.textEdit.setObjectName(_fromUtf8("textEdit"))
        self.horizontalLayout.addWidget(self.textEdit)
        self.verticalLayout.addLayout(self.horizontalLayout)
        self.buttonBox = QtGui.QDialogButtonBox(self.verticalLayoutWidget)
        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
        self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
        self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
        self.verticalLayout.addWidget(self.buttonBox)

        self.retranslateUi(Dialog)
        QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
        QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        Dialog.setWindowTitle(_translate("Dialog", "Dialog", None))
        self.label.setText(_translate("Dialog", "Drop .html file(s):", None))

但是,按下按钮框中的“确定”按钮后,事件以及函数accept()将被触发两次。

此外,我发现在将几个文件放入QTextEdit后,窗口小部件不会更改其高度,或者至少会自动添加滚动窗格。

任何想法如何解决这两个问题?

我认为我的代码非常混乱,它可以工作,但它的编程并不是很好。

有人可以就如何重构代码提出建议吗?我还能做些什么呢?

谢谢!

1 个答案:

答案 0 :(得分:0)

我发现自己是单击确定按钮后关闭QDialog问题的解决方案。我不得不删除design.py中的accept()插槽。

但是,当多个文件被删除时,我仍然无法看到添加的滚动条。