在两个QTreeViews之间拖放。

时间:2022-11-03 15:04:34

My purpose is to make drag and drop between two QTreeViews. Eg: drag on item from a local treeview to a remote treeview, the remote treeview will accept signal and trigger one function (eg: print some thing, so I know it succeeded).

我的目的是在两个QTreeViews之间进行拖放。从本地treeview到远程树视图,远程treeview将接受信号并触发一个函数(例如:打印一些东西,所以我知道它成功了)。

I have searched some posts, they just do with one QTreeView, and I'm still confused how to use drag and drop. This is my full code, including the UI.

我搜索了一些帖子,他们只做了一个QTreeView,我仍然困惑如何使用拖放。这是我的完整代码,包括UI。

main.py

main.py

    # coding=utf-8
    __author__ = 'Administrator'

    import os, re, sys, time, math
    import ConfigParser
    from PyQt4 import QtCore, QtGui
    from PyQt4.QtCore import *
    from PyQt4.QtGui import *
    from MainWindow_ui import Ui_MainWindow
    import AccountDialog_ui


    ######## Config ini File Part#######################
    def create_conf_ini(ipaddress='', username='', password='',  secret='',mode="a+"):
        conf = ConfigParser.ConfigParser()
        conf.add_section("logininfor")
        conf.set("logininfor", "ipaddress", ipaddress)
        conf.set("logininfor", "username", username)
        conf.set("logininfor", "password", password)
        conf.set("logininfor", "secret", secret)
        f = open('config.ini', mode)
        conf.write(f)
        f.close()

    ### get conf file
    def get_infor_from_config():
        conf = ConfigParser.ConfigParser()
        if os.path.isfile('config.ini'):
            conf.read("config.ini")
            ipaddress = conf.get("logininfor", "ipaddress")
            username = conf.get("logininfor", "username")
            password = conf.get("logininfor", "password")
            secret = conf.get("logininfor", "secret")
            return ipaddress, username, password, secret
        else:
            create_conf_ini()
            return '', '', '', ''
    ###############################

    class S3MiniToolsView(QtGui.QMainWindow, Ui_MainWindow):
        def __init__(self):
            QtGui.QMainWindow.__init__(self)
            self.setupUi(self)
            self.actionAccount_Setting.triggered.connect(self.accountsetting_dlg)

            self.init_localtreeview()
            self.init_remotetreeview()
            QtGui.QTreeView.connect(self.remote_Treeview, QtCore.SIGNAL('dropEvent()'), self.additem)

            (ipaddress, username, password, secret) = get_infor_from_config()
            self.servername_mainw.setText(ipaddress)
            self.uid_mainw.setText(username)
            self.accesskey_mainw.setText(password)
            self.secretkey_mainw.setText(secret)

        def init_localtreeview(self):
            self.fileSystemModel = QFileSystemModel(self.local_Treeview)
            self.fileSystemModel.setReadOnly(False)
            #self.fileSystemModel.setFilter(QDir.AllDirs | QDir.NoDotAndDotDot | QDir.Drives)
            root = self.fileSystemModel.setRootPath("")
            self.local_Treeview.setModel(self.fileSystemModel)
            self.local_Treeview.setRootIndex(root)
            self.local_Treeview.setDragDropMode(QtGui.QAbstractItemView.DragOnly)
            #QtCore.QObject.connect(self.local_Treeview.selectionModel(), QtCore.SIGNAL('selectionChanged(QItemSelection, QItemSelection)'), self.test)
            #self.local_Treeview.clicked[QtCore.QModelIndex].connect(self.test)
            self.local_Treeview.clicked.connect(self.test)
            self.local_Treeview.setDragEnabled(True)
        def init_remotetreeview(self):
            self.remote_Treeview.setDragDropMode(QtGui.QAbstractItemView.DropOnly)
            # self.fileSystemModel = QFileSystemModel(self.local_Treeview)
            # self.fileSystemModel.setReadOnly(False)
            # self.remote_Treeview.setModel(self.fileSystemModel)
            self.model = QtGui.QStandardItemModel(self.remote_Treeview)
            self.remote_Treeview.setModel(self.model)

            self.remote_Treeview.setAcceptDrops(True)


        def dragEnterEvent(self, e):

            if e.mimeData().hasFormat('text/plain'):
                e.accept()

            else:
                e.ignore()

        def dropEvent(self, e):
            print 'In dropEvent'
            # item = QtGui.QStandardItem("did ok")
            # self.model.appendRow(item)
            #self.remote_Treeview.(e.mimeData().text())

        def additem(self):
            item = QtGui.QStandardItem("did ok")
            self.model.appendRow(item)

        #@QtCore.pyqtSlot("QItemSelection, QItemSelection")
        @QtCore.pyqtSlot(QtCore.QModelIndex)
        def test(self, index):
            indexItem = self.fileSystemModel.index(index.row(), 0, index.parent())
            # path or filename selected
            fileName = self.fileSystemModel.fileName(indexItem)
            # full path/filename selected
            filePath = self.fileSystemModel.filePath(indexItem)

            print("hello!")
            print(fileName)
            print(filePath)


        def accountsetting_dlg(self):
            print "AccountSetting"
            accountdlg = QuickConnectDlg(self)
            accountdlg.lineEdit_servername.setText( 'ceph-radosgw.lab.com')
            accountdlg.lineEdit_accountname.setText( 'johndoe')
            accountdlg.lineEdit_accesskey.setText( 'CIXN1L1B42JAYGV6KSIT')
            accountdlg.lineEdit_secretkey.setText('17YTAqVBL60StWQniDNWoAH04bScFbjxAxpxNFCg')
            accountdlg.lineEdit_httpport.setText( '8080')
            accountdlg.lineEdit_httpsport.setText( '443')

            if accountdlg.exec_():

                servername = accountdlg.lineEdit_servername.text()
                accountname = accountdlg.lineEdit_accountname.text()
                accesskey = accountdlg.lineEdit_accesskey.text()
                secretkey = accountdlg.lineEdit_secretkey.text()

                create_conf_ini(servername, accountname, accesskey, secretkey, 'r+')

            return

    class QuickConnectDlg(QDialog, AccountDialog_ui.Ui_accountDialog):
        def __init__(self, parent=None):
            super(QuickConnectDlg, self).__init__(parent)
            self.setupUi(self)


    def main():
        app = QApplication(sys.argv)
        window = S3MiniToolsView()
        window.show()
        sys.exit(app.exec_())


    if __name__ == "__main__":
        main()

this is the MainWindow_ui.py

这是MainWindow_ui.py

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

    # Form implementation generated from reading ui file 'MainWindow.ui'
    #
    # Created: Thu Aug 28 09:43:28 2014
    #      by: PyQt4 UI code generator 4.11.1
    #
    # 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_MainWindow(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName(_fromUtf8("MainWindow"))
            MainWindow.resize(961, 623)
            MainWindow.setInputMethodHints(QtCore.Qt.ImhNone)
            self.centralwidget = QtGui.QWidget(MainWindow)
            self.centralwidget.setEnabled(True)
            self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
            self.verticalLayoutWidget_3 = QtGui.QWidget(self.centralwidget)
            self.verticalLayoutWidget_3.setGeometry(QtCore.QRect(20, 550, 91, 41))
            self.verticalLayoutWidget_3.setObjectName(_fromUtf8("verticalLayoutWidget_3"))
            self.verticalLayout_3 = QtGui.QVBoxLayout(self.verticalLayoutWidget_3)
            self.verticalLayout_3.setMargin(0)
            self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3"))
            self.pButton_Exportxls = QtGui.QPushButton(self.verticalLayoutWidget_3)
            self.pButton_Exportxls.setObjectName(_fromUtf8("pButton_Exportxls"))
            self.verticalLayout_3.addWidget(self.pButton_Exportxls)
            self.label_4 = QtGui.QLabel(self.centralwidget)
            self.label_4.setGeometry(QtCore.QRect(0, 130, 951, 20))
            self.label_4.setFrameShape(QtGui.QFrame.Box)
            self.label_4.setFrameShadow(QtGui.QFrame.Sunken)
            self.label_4.setObjectName(_fromUtf8("label_4"))
            self.horizontalGroupBox = QtGui.QGroupBox(self.centralwidget)
            self.horizontalGroupBox.setGeometry(QtCore.QRect(0, 20, 961, 51))
            self.horizontalGroupBox.setObjectName(_fromUtf8("horizontalGroupBox"))
            self.horizontalLayout = QtGui.QHBoxLayout(self.horizontalGroupBox)
            self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
            self.label_10 = QtGui.QLabel(self.horizontalGroupBox)
            self.label_10.setFrameShape(QtGui.QFrame.NoFrame)
            self.label_10.setFrameShadow(QtGui.QFrame.Sunken)
            self.label_10.setAlignment(QtCore.Qt.AlignCenter)
            self.label_10.setObjectName(_fromUtf8("label_10"))
            self.horizontalLayout.addWidget(self.label_10)
            self.servername_mainw = QtGui.QLineEdit(self.horizontalGroupBox)
            self.servername_mainw.setObjectName(_fromUtf8("servername_mainw"))
            self.horizontalLayout.addWidget(self.servername_mainw)
            self.label_5 = QtGui.QLabel(self.horizontalGroupBox)
            self.label_5.setFrameShape(QtGui.QFrame.NoFrame)
            self.label_5.setFrameShadow(QtGui.QFrame.Sunken)
            self.label_5.setAlignment(QtCore.Qt.AlignCenter)
            self.label_5.setObjectName(_fromUtf8("label_5"))
            self.horizontalLayout.addWidget(self.label_5)
            self.uid_mainw = QtGui.QLineEdit(self.horizontalGroupBox)
            self.uid_mainw.setObjectName(_fromUtf8("uid_mainw"))
            self.horizontalLayout.addWidget(self.uid_mainw)
            self.label_3 = QtGui.QLabel(self.horizontalGroupBox)
            self.label_3.setFrameShape(QtGui.QFrame.NoFrame)
            self.label_3.setFrameShadow(QtGui.QFrame.Sunken)
            self.label_3.setAlignment(QtCore.Qt.AlignCenter)
            self.label_3.setObjectName(_fromUtf8("label_3"))
            self.horizontalLayout.addWidget(self.label_3)
            self.accesskey_mainw = QtGui.QLineEdit(self.horizontalGroupBox)
            self.accesskey_mainw.setObjectName(_fromUtf8("accesskey_mainw"))
            self.horizontalLayout.addWidget(self.accesskey_mainw)
            self.label_6 = QtGui.QLabel(self.horizontalGroupBox)
            self.label_6.setFrameShape(QtGui.QFrame.NoFrame)
            self.label_6.setFrameShadow(QtGui.QFrame.Sunken)
            self.label_6.setAlignment(QtCore.Qt.AlignCenter)
            self.label_6.setObjectName(_fromUtf8("label_6"))
            self.horizontalLayout.addWidget(self.label_6)
            self.secretkey_mainw = QtGui.QLineEdit(self.horizontalGroupBox)
            self.secretkey_mainw.setInputMethodHints(QtCore.Qt.ImhHiddenText|QtCore.Qt.ImhNoAutoUppercase|QtCore.Qt.ImhNoPredictiveText|QtCore.Qt.ImhPreferNumbers)
            self.secretkey_mainw.setText(_fromUtf8(""))
            self.secretkey_mainw.setEchoMode(QtGui.QLineEdit.Password)
            self.secretkey_mainw.setObjectName(_fromUtf8("secretkey_mainw"))
            self.horizontalLayout.addWidget(self.secretkey_mainw)
            spacerItem = QtGui.QSpacerItem(20, 10, QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Minimum)
            self.horizontalLayout.addItem(spacerItem)
            self.connect_pButton = QtGui.QPushButton(self.horizontalGroupBox)
            sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed)
            sizePolicy.setHorizontalStretch(0)
            sizePolicy.setVerticalStretch(0)
            sizePolicy.setHeightForWidth(self.connect_pButton.sizePolicy().hasHeightForWidth())
            self.connect_pButton.setSizePolicy(sizePolicy)
            self.connect_pButton.setMinimumSize(QtCore.QSize(75, 23))
            self.connect_pButton.setMaximumSize(QtCore.QSize(75, 23))
            self.connect_pButton.setObjectName(_fromUtf8("connect_pButton"))
            self.horizontalLayout.addWidget(self.connect_pButton)
            self.filename = QtGui.QLineEdit(self.centralwidget)
            self.filename.setGeometry(QtCore.QRect(190, 540, 110, 20))
            self.filename.setObjectName(_fromUtf8("filename"))
            self.label_7 = QtGui.QLabel(self.centralwidget)
            self.label_7.setGeometry(QtCore.QRect(460, 75, 78, 16))
            self.label_7.setFrameShape(QtGui.QFrame.NoFrame)
            self.label_7.setFrameShadow(QtGui.QFrame.Sunken)
            self.label_7.setAlignment(QtCore.Qt.AlignCenter)
            self.label_7.setObjectName(_fromUtf8("label_7"))
            self.buckets_cBox_mainw = QtGui.QComboBox(self.centralwidget)
            self.buckets_cBox_mainw.setGeometry(QtCore.QRect(103, 100, 111, 20))
            self.buckets_cBox_mainw.setObjectName(_fromUtf8("buckets_cBox_mainw"))
            self.label_8 = QtGui.QLabel(self.centralwidget)
            self.label_8.setGeometry(QtCore.QRect(20, 100, 78, 16))
            self.label_8.setFrameShape(QtGui.QFrame.NoFrame)
            self.label_8.setFrameShadow(QtGui.QFrame.Sunken)
            self.label_8.setAlignment(QtCore.Qt.AlignCenter)
            self.label_8.setObjectName(_fromUtf8("label_8"))
            self.uri_mainw = QtGui.QLineEdit(self.centralwidget)
            self.uri_mainw.setGeometry(QtCore.QRect(103, 76, 261, 20))
            self.uri_mainw.setObjectName(_fromUtf8("uri_mainw"))
            self.label_9 = QtGui.QLabel(self.centralwidget)
            self.label_9.setGeometry(QtCore.QRect(20, 80, 78, 16))
            self.label_9.setFrameShape(QtGui.QFrame.NoFrame)
            self.label_9.setFrameShadow(QtGui.QFrame.Sunken)
            self.label_9.setAlignment(QtCore.Qt.AlignCenter)
            self.label_9.setObjectName(_fromUtf8("label_9"))
            self.local_Treeview = QtGui.QTreeView(self.centralwidget)
            self.local_Treeview.setGeometry(QtCore.QRect(0, 160, 501, 361))
            self.local_Treeview.setEditTriggers(QtGui.QAbstractItemView.DoubleClicked|QtGui.QAbstractItemView.EditKeyPressed|QtGui.QAbstractItemView.SelectedClicked)
            self.local_Treeview.setDragEnabled(True)
            self.local_Treeview.setDragDropMode(QtGui.QAbstractItemView.DragDrop)
            self.local_Treeview.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
            self.local_Treeview.setObjectName(_fromUtf8("local_Treeview"))
            self.remote_Treeview = QtGui.QTreeView(self.centralwidget)
            self.remote_Treeview.setGeometry(QtCore.QRect(507, 160, 451, 361))
            self.remote_Treeview.setEditTriggers(QtGui.QAbstractItemView.DoubleClicked|QtGui.QAbstractItemView.EditKeyPressed|QtGui.QAbstractItemView.SelectedClicked)
            self.remote_Treeview.setDragDropMode(QtGui.QAbstractItemView.DropOnly)
            self.remote_Treeview.setDefaultDropAction(QtCore.Qt.CopyAction)
            self.remote_Treeview.setObjectName(_fromUtf8("remote_Treeview"))
            self.root_cBox_mainw = QtGui.QComboBox(self.centralwidget)
            self.root_cBox_mainw.setGeometry(QtCore.QRect(536, 70, 141, 20))
            self.root_cBox_mainw.setObjectName(_fromUtf8("root_cBox_mainw"))
            MainWindow.setCentralWidget(self.centralwidget)
            self.menubar = QtGui.QMenuBar(MainWindow)
            self.menubar.setGeometry(QtCore.QRect(0, 0, 961, 17))
            self.menubar.setObjectName(_fromUtf8("menubar"))
            self.menuW = QtGui.QMenu(self.menubar)
            self.menuW.setObjectName(_fromUtf8("menuW"))
            self.menu = QtGui.QMenu(self.menubar)
            self.menu.setObjectName(_fromUtf8("menu"))
            self.menuTools = QtGui.QMenu(self.menubar)
            self.menuTools.setObjectName(_fromUtf8("menuTools"))
            MainWindow.setMenuBar(self.menubar)
            self.statusbar = QtGui.QStatusBar(MainWindow)
            self.statusbar.setObjectName(_fromUtf8("statusbar"))
            MainWindow.setStatusBar(self.statusbar)
            self.actionOpenfile = QtGui.QAction(MainWindow)
            icon = QtGui.QIcon()
            icon.addPixmap(QtGui.QPixmap(_fromUtf8("../Gui-test/Resource/OpenFile.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
            self.actionOpenfile.setIcon(icon)
            self.actionOpenfile.setObjectName(_fromUtf8("actionOpenfile"))
            self.actionAccount_Setting = QtGui.QAction(MainWindow)
            self.actionAccount_Setting.setObjectName(_fromUtf8("actionAccount_Setting"))
            self.menuW.addAction(self.actionOpenfile)
            self.menuTools.addAction(self.actionAccount_Setting)
            self.menubar.addAction(self.menuW.menuAction())
            self.menubar.addAction(self.menuTools.menuAction())
            self.menubar.addAction(self.menu.menuAction())

            self.retranslateUi(MainWindow)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
            MainWindow.setTabOrder(self.uid_mainw, self.accesskey_mainw)
            MainWindow.setTabOrder(self.accesskey_mainw, self.secretkey_mainw)
            MainWindow.setTabOrder(self.secretkey_mainw, self.connect_pButton)
            MainWindow.setTabOrder(self.connect_pButton, self.pButton_Exportxls)

        def retranslateUi(self, MainWindow):
            MainWindow.setWindowTitle(_translate("MainWindow", "mini S3 File Manager", None))
            self.pButton_Exportxls.setText(_translate("MainWindow", "导出到xls", None))
            self.label_4.setText(_translate("MainWindow", "Detail Information:", None))
            self.horizontalGroupBox.setTitle(_translate("MainWindow", "S3 Storage Account Information:", None))
            self.label_10.setText(_translate("MainWindow", "Server:", None))
            self.servername_mainw.setToolTip(_translate("MainWindow", "需要检查的设备IP", None))
            self.label_5.setText(_translate("MainWindow", "Account name:", None))
            self.uid_mainw.setToolTip(_translate("MainWindow", "需要检查的设备IP", None))
            self.label_3.setText(_translate("MainWindow", "Access key:", None))
            self.label_6.setText(_translate("MainWindow", "Secret key:", None))
            self.connect_pButton.setToolTip(_translate("MainWindow", "开始检查", None))
            self.connect_pButton.setText(_translate("MainWindow", "Connect", None))
            self.label_7.setText(_translate("MainWindow", "Root:", None))
            self.label_8.setText(_translate("MainWindow", "My Buckets:", None))
            self.label_9.setText(_translate("MainWindow", "URI:", None))
            self.menuW.setTitle(_translate("MainWindow", "文件", None))
            self.menu.setTitle(_translate("MainWindow", "帮助", None))
            self.menuTools.setTitle(_translate("MainWindow", "Tools", None))
            self.actionOpenfile.setText(_translate("MainWindow", "Openfile", None))
            self.actionAccount_Setting.setText(_translate("MainWindow", "Account Setting", None))

AccountDialog_ui.py

AccountDialog_ui.py

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

    # Form implementation generated from reading ui file 'AccountDialog.ui'
    #
    # Created: Mon Aug 25 23:41:07 2014
    #      by: PyQt4 UI code generator 4.11.1
    #
    # 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_accountDialog(object):
        def setupUi(self, accountDialog):
            accountDialog.setObjectName(_fromUtf8("accountDialog"))
            accountDialog.resize(400, 248)
            self.layoutWidget = QtGui.QWidget(accountDialog)
            self.layoutWidget.setGeometry(QtCore.QRect(10, 10, 380, 225))
            self.layoutWidget.setObjectName(_fromUtf8("layoutWidget"))
            self.gridLayout_3 = QtGui.QGridLayout(self.layoutWidget)
            self.gridLayout_3.setMargin(0)
            self.gridLayout_3.setObjectName(_fromUtf8("gridLayout_3"))
            self.tabWidget_2 = QtGui.QTabWidget(self.layoutWidget)
            self.tabWidget_2.setObjectName(_fromUtf8("tabWidget_2"))
            self.tabWidgetPage1_2 = QtGui.QWidget()
            self.tabWidgetPage1_2.setObjectName(_fromUtf8("tabWidgetPage1_2"))
            self.gridLayout_4 = QtGui.QGridLayout(self.tabWidgetPage1_2)
            self.gridLayout_4.setObjectName(_fromUtf8("gridLayout_4"))
            self.label_7 = QtGui.QLabel(self.tabWidgetPage1_2)
            self.label_7.setObjectName(_fromUtf8("label_7"))
            self.gridLayout_4.addWidget(self.label_7, 0, 0, 1, 1)
            self.lineEdit_servername = QtGui.QLineEdit(self.tabWidgetPage1_2)
            self.lineEdit_servername.setObjectName(_fromUtf8("lineEdit_servername"))
            self.gridLayout_4.addWidget(self.lineEdit_servername, 0, 1, 1, 2)
            self.label_8 = QtGui.QLabel(self.tabWidgetPage1_2)
            self.label_8.setObjectName(_fromUtf8("label_8"))
            self.gridLayout_4.addWidget(self.label_8, 1, 0, 1, 1)
            self.lineEdit_accountname = QtGui.QLineEdit(self.tabWidgetPage1_2)
            self.lineEdit_accountname.setObjectName(_fromUtf8("lineEdit_accountname"))
            self.gridLayout_4.addWidget(self.lineEdit_accountname, 1, 1, 1, 2)
            self.label_9 = QtGui.QLabel(self.tabWidgetPage1_2)
            self.label_9.setObjectName(_fromUtf8("label_9"))
            self.gridLayout_4.addWidget(self.label_9, 2, 0, 1, 1)
            self.lineEdit_accesskey = QtGui.QLineEdit(self.tabWidgetPage1_2)
            self.lineEdit_accesskey.setObjectName(_fromUtf8("lineEdit_accesskey"))
            self.gridLayout_4.addWidget(self.lineEdit_accesskey, 2, 1, 1, 2)
            self.label_10 = QtGui.QLabel(self.tabWidgetPage1_2)
            self.label_10.setObjectName(_fromUtf8("label_10"))
            self.gridLayout_4.addWidget(self.label_10, 3, 0, 1, 1)
            self.lineEdit_secretkey = QtGui.QLineEdit(self.tabWidgetPage1_2)
            self.lineEdit_secretkey.setObjectName(_fromUtf8("lineEdit_secretkey"))
            self.gridLayout_4.addWidget(self.lineEdit_secretkey, 3, 1, 1, 2)
            self.label_11 = QtGui.QLabel(self.tabWidgetPage1_2)
            self.label_11.setObjectName(_fromUtf8("label_11"))
            self.gridLayout_4.addWidget(self.label_11, 4, 0, 1, 1)
            self.lineEdit_httpport = QtGui.QLineEdit(self.tabWidgetPage1_2)
            self.lineEdit_httpport.setObjectName(_fromUtf8("lineEdit_httpport"))
            self.gridLayout_4.addWidget(self.lineEdit_httpport, 4, 1, 1, 1)
            self.label_12 = QtGui.QLabel(self.tabWidgetPage1_2)
            self.label_12.setObjectName(_fromUtf8("label_12"))
            self.gridLayout_4.addWidget(self.label_12, 5, 0, 1, 1)
            self.lineEdit_httpsport = QtGui.QLineEdit(self.tabWidgetPage1_2)
            self.lineEdit_httpsport.setObjectName(_fromUtf8("lineEdit_httpsport"))
            self.gridLayout_4.addWidget(self.lineEdit_httpsport, 5, 1, 1, 1)
            self.checkBox_https = QtGui.QCheckBox(self.tabWidgetPage1_2)
            self.checkBox_https.setObjectName(_fromUtf8("checkBox_https"))
            self.gridLayout_4.addWidget(self.checkBox_https, 5, 2, 1, 1)
            self.tabWidget_2.addTab(self.tabWidgetPage1_2, _fromUtf8(""))
            self.gridLayout_3.addWidget(self.tabWidget_2, 0, 0, 1, 3)
            spacerItem = QtGui.QSpacerItem(218, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
            self.gridLayout_3.addItem(spacerItem, 1, 0, 1, 1)
            self.buttonBox = QtGui.QDialogButtonBox(self.layoutWidget)
            self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
            self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
            self.gridLayout_3.addWidget(self.buttonBox, 1, 1, 1, 1)

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

        def retranslateUi(self, accountDialog):
            accountDialog.setWindowTitle(_translate("accountDialog", "Account", None))
            self.label_7.setText(_translate("accountDialog", "Server name", None))
            self.label_8.setText(_translate("accountDialog", "Account name", None))
            self.label_9.setText(_translate("accountDialog", "Access key", None))
            self.label_10.setText(_translate("accountDialog", "Secret key", None))
            self.label_11.setText(_translate("accountDialog", "HTTP Port", None))
            self.lineEdit_httpport.setText(_translate("accountDialog", "8080", None))
            self.label_12.setText(_translate("accountDialog", "HTTPS Port", None))
            self.lineEdit_httpsport.setText(_translate("accountDialog", "443", None))
            self.checkBox_https.setText(_translate("accountDialog", "Connect usring SSL/HTTPS", None))
            self.tabWidget_2.setTabText(self.tabWidget_2.indexOf(self.tabWidgetPage1_2), _translate("accountDialog", "Account", None))

1 个解决方案

#1


1  

If your exchange data between 2 widget, I suggest to use QTreeWidget more than QTreeView because data in QTreeWidget can edit dynamic data, row and value. In drag and drop between 2 QTreeWidget we can equivalent them "copy and delete".

如果您在两个小部件之间交换数据,我建议使用QTreeWidget而不是QTreeView,因为QTreeWidget中的数据可以编辑动态数据、行和值。在两个QTreeWidget之间的拖放操作中,我们可以将其等效为“复制和删除”。

Easy to implement between 2 QTreeWidget, your just handle when drag enter event in QTreeWidget and copy to new QTreeWidget. (If your internal move, I will delete old data by itself) Next, Create your own signal to handle them if have move data between QTreeWidget. Last, integrate it in your class or widget.

很容易在两个QTreeWidget之间实现,在QTreeWidget中拖动输入事件并将其复制到新的QTreeWidget时,您只需处理它。(如果您的内部移动,我将自己删除旧数据)接下来,如果在QTreeWidget之间移动数据,创建您自己的信号来处理它们。最后,将其集成到您的类或小部件中。

Example (Not your code, But your can implement it by yourself), Like this;

示例(不是您的代码,但是您可以自己实现它),像这样;

import sys
from PyQt4 import QtCore, QtGui

class QCustomTreeWidget (QtGui.QTreeWidget):
    itemMoveOutActivated = QtCore.pyqtSignal(object)
    itemNewMoveActivated = QtCore.pyqtSignal(object)

    def __init__ (self, parent = None):
        super(QCustomTreeWidget, self).__init__(parent)
        self.setDragDropMode(QtGui.QAbstractItemView.InternalMove)

    def dragEnterEvent (self, eventQDragEnterEvent):
        sourceQCustomTreeWidget = eventQDragEnterEvent.source()
        if isinstance(sourceQCustomTreeWidget, QCustomTreeWidget) and (self is not sourceQCustomTreeWidget):
            eventQDragEnterEvent.accept()
        else:
            QtGui.QTreeWidget.dragEnterEvent(self, eventQDragEnterEvent)

    def dropEvent (self, eventQDropEvent):
        sourceQCustomTreeWidget = eventQDropEvent.source()
        if isinstance(sourceQCustomTreeWidget, QCustomTreeWidget) and (self is not sourceQCustomTreeWidget):
            sourceQTreeWidgetItem      = sourceQCustomTreeWidget.currentItem()
            destinationQTreeWidgetItem = sourceQTreeWidgetItem.clone()
            self.addTopLevelItem(destinationQTreeWidgetItem)
            sourceQCustomTreeWidget.itemMoveOutActivated.emit(destinationQTreeWidgetItem)
            self.itemNewMoveActivated.emit(destinationQTreeWidgetItem)
        else:
            QtGui.QTreeWidget.dropEvent(self, eventQDropEvent)

class QCustomQWidget (QtGui.QWidget):
    def __init__ (self, parent = None):
        super(QCustomQWidget, self).__init__(parent)
        self.my1QCustomTreeWidget = QCustomTreeWidget(self)
        self.my2QCustomTreeWidget = QCustomTreeWidget(self)
        self.my1QCustomTreeWidget.itemMoveOutActivated.connect(self.itemMoveOutActivatedCallBack1)
        self.my2QCustomTreeWidget.itemMoveOutActivated.connect(self.itemMoveOutActivatedCallBack2)
        self.my1QCustomTreeWidget.itemNewMoveActivated.connect(self.itemNewMoveActivatedCallBack1)
        self.my2QCustomTreeWidget.itemNewMoveActivated.connect(self.itemNewMoveActivatedCallBack2)
        listsExampleQTreeWidgetItem = [QtGui.QTreeWidgetItem([name]) for name in ['Part A', 'Part B', 'Part C']]
        self.my1QCustomTreeWidget.addTopLevelItems(listsExampleQTreeWidgetItem)
        self.allQHBoxLayout = QtGui.QHBoxLayout()
        self.allQHBoxLayout.addWidget(self.my1QCustomTreeWidget)
        self.allQHBoxLayout.addWidget(self.my2QCustomTreeWidget)
        self.setLayout(self.allQHBoxLayout)

    @QtCore.pyqtSlot(QtGui.QTreeWidgetItem)
    def itemMoveOutActivatedCallBack1 (self, goneQTreeWidgetItem):
        print 'QTreeWidget 1 has move QTreeWidgetItem to Another QTreeWidget'

    @QtCore.pyqtSlot(QtGui.QTreeWidgetItem)
    def itemMoveOutActivatedCallBack2 (self, goneQTreeWidgetItem):
        print 'QTreeWidget 2 has move QTreeWidgetItem to Another QTreeWidget'

    @QtCore.pyqtSlot(QtGui.QTreeWidgetItem)
    def itemNewMoveActivatedCallBack1 (self, newQTreeWidgetItem):
        print 'Another QTreeWidget has move QTreeWidgetItem in QTreeWidget 1'

    @QtCore.pyqtSlot(QtGui.QTreeWidgetItem)
    def itemNewMoveActivatedCallBack2 (self, newQTreeWidgetItem):
        print 'Another QTreeWidget has move QTreeWidgetItem in QTreeWidget 2'

app = QtGui.QApplication(sys.argv)
myQCustomQWidget = QCustomQWidget()
myQCustomQWidget.show()
sys.exit(app.exec_())

Hope is helps,

希望有所帮助,

#1


1  

If your exchange data between 2 widget, I suggest to use QTreeWidget more than QTreeView because data in QTreeWidget can edit dynamic data, row and value. In drag and drop between 2 QTreeWidget we can equivalent them "copy and delete".

如果您在两个小部件之间交换数据,我建议使用QTreeWidget而不是QTreeView,因为QTreeWidget中的数据可以编辑动态数据、行和值。在两个QTreeWidget之间的拖放操作中,我们可以将其等效为“复制和删除”。

Easy to implement between 2 QTreeWidget, your just handle when drag enter event in QTreeWidget and copy to new QTreeWidget. (If your internal move, I will delete old data by itself) Next, Create your own signal to handle them if have move data between QTreeWidget. Last, integrate it in your class or widget.

很容易在两个QTreeWidget之间实现,在QTreeWidget中拖动输入事件并将其复制到新的QTreeWidget时,您只需处理它。(如果您的内部移动,我将自己删除旧数据)接下来,如果在QTreeWidget之间移动数据,创建您自己的信号来处理它们。最后,将其集成到您的类或小部件中。

Example (Not your code, But your can implement it by yourself), Like this;

示例(不是您的代码,但是您可以自己实现它),像这样;

import sys
from PyQt4 import QtCore, QtGui

class QCustomTreeWidget (QtGui.QTreeWidget):
    itemMoveOutActivated = QtCore.pyqtSignal(object)
    itemNewMoveActivated = QtCore.pyqtSignal(object)

    def __init__ (self, parent = None):
        super(QCustomTreeWidget, self).__init__(parent)
        self.setDragDropMode(QtGui.QAbstractItemView.InternalMove)

    def dragEnterEvent (self, eventQDragEnterEvent):
        sourceQCustomTreeWidget = eventQDragEnterEvent.source()
        if isinstance(sourceQCustomTreeWidget, QCustomTreeWidget) and (self is not sourceQCustomTreeWidget):
            eventQDragEnterEvent.accept()
        else:
            QtGui.QTreeWidget.dragEnterEvent(self, eventQDragEnterEvent)

    def dropEvent (self, eventQDropEvent):
        sourceQCustomTreeWidget = eventQDropEvent.source()
        if isinstance(sourceQCustomTreeWidget, QCustomTreeWidget) and (self is not sourceQCustomTreeWidget):
            sourceQTreeWidgetItem      = sourceQCustomTreeWidget.currentItem()
            destinationQTreeWidgetItem = sourceQTreeWidgetItem.clone()
            self.addTopLevelItem(destinationQTreeWidgetItem)
            sourceQCustomTreeWidget.itemMoveOutActivated.emit(destinationQTreeWidgetItem)
            self.itemNewMoveActivated.emit(destinationQTreeWidgetItem)
        else:
            QtGui.QTreeWidget.dropEvent(self, eventQDropEvent)

class QCustomQWidget (QtGui.QWidget):
    def __init__ (self, parent = None):
        super(QCustomQWidget, self).__init__(parent)
        self.my1QCustomTreeWidget = QCustomTreeWidget(self)
        self.my2QCustomTreeWidget = QCustomTreeWidget(self)
        self.my1QCustomTreeWidget.itemMoveOutActivated.connect(self.itemMoveOutActivatedCallBack1)
        self.my2QCustomTreeWidget.itemMoveOutActivated.connect(self.itemMoveOutActivatedCallBack2)
        self.my1QCustomTreeWidget.itemNewMoveActivated.connect(self.itemNewMoveActivatedCallBack1)
        self.my2QCustomTreeWidget.itemNewMoveActivated.connect(self.itemNewMoveActivatedCallBack2)
        listsExampleQTreeWidgetItem = [QtGui.QTreeWidgetItem([name]) for name in ['Part A', 'Part B', 'Part C']]
        self.my1QCustomTreeWidget.addTopLevelItems(listsExampleQTreeWidgetItem)
        self.allQHBoxLayout = QtGui.QHBoxLayout()
        self.allQHBoxLayout.addWidget(self.my1QCustomTreeWidget)
        self.allQHBoxLayout.addWidget(self.my2QCustomTreeWidget)
        self.setLayout(self.allQHBoxLayout)

    @QtCore.pyqtSlot(QtGui.QTreeWidgetItem)
    def itemMoveOutActivatedCallBack1 (self, goneQTreeWidgetItem):
        print 'QTreeWidget 1 has move QTreeWidgetItem to Another QTreeWidget'

    @QtCore.pyqtSlot(QtGui.QTreeWidgetItem)
    def itemMoveOutActivatedCallBack2 (self, goneQTreeWidgetItem):
        print 'QTreeWidget 2 has move QTreeWidgetItem to Another QTreeWidget'

    @QtCore.pyqtSlot(QtGui.QTreeWidgetItem)
    def itemNewMoveActivatedCallBack1 (self, newQTreeWidgetItem):
        print 'Another QTreeWidget has move QTreeWidgetItem in QTreeWidget 1'

    @QtCore.pyqtSlot(QtGui.QTreeWidgetItem)
    def itemNewMoveActivatedCallBack2 (self, newQTreeWidgetItem):
        print 'Another QTreeWidget has move QTreeWidgetItem in QTreeWidget 2'

app = QtGui.QApplication(sys.argv)
myQCustomQWidget = QCustomQWidget()
myQCustomQWidget.show()
sys.exit(app.exec_())

Hope is helps,

希望有所帮助,