【发布时间】:2016-04-07 20:43:30
【问题描述】:
我正在尝试编写一个小型应用程序,并希望以某种方式“捕获”行被拖放但对表格没有影响的行号。我创建了两个文件,第一个是在 Qt Designer 中为基本 GUI 创建的 MainWindow UI 文件,第二个是用一些数据布局 QTableWidget 的代码。
它可以按我的意愿工作,也就是说它向用户显示拖放动作,但在放下时没有任何变化。我读过其他帖子,但他们似乎都想移动数据,所以他们对此没有任何帮助。
UiFile.py
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'UiFile.ui'
#
# Created: Thu Apr 7 21:07:11 2016
# by: PyQt4 UI code generator 4.11.2
#
# 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(763, 269)
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
self.gridLayout = QtGui.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
self.tableWidget = QtGui.QTableWidget(self.centralwidget)
self.tableWidget.setDragEnabled(False)
self.tableWidget.setDragDropOverwriteMode(False)
self.tableWidget.setDragDropMode(QtGui.QAbstractItemView.DragDrop)
self.tableWidget.setDefaultDropAction(QtCore.Qt.ActionMask)
self.tableWidget.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
self.tableWidget.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
self.tableWidget.setObjectName(_fromUtf8("tableWidget"))
self.tableWidget.setColumnCount(7)
self.tableWidget.setRowCount(0)
item = QtGui.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(0, item)
item = QtGui.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(1, item)
item = QtGui.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(2, item)
item = QtGui.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(3, item)
item = QtGui.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(4, item)
item = QtGui.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(5, item)
item = QtGui.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(6, item)
self.gridLayout.addWidget(self.tableWidget, 0, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 763, 24))
self.menubar.setObjectName(_fromUtf8("menubar"))
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtGui.QStatusBar(MainWindow)
self.statusbar.setObjectName(_fromUtf8("statusbar"))
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
item = self.tableWidget.horizontalHeaderItem(0)
item.setText(_translate("MainWindow", "Column 1", None))
item = self.tableWidget.horizontalHeaderItem(1)
item.setText(_translate("MainWindow", "Column 2", None))
item = self.tableWidget.horizontalHeaderItem(2)
item.setText(_translate("MainWindow", "Column 3", None))
item = self.tableWidget.horizontalHeaderItem(3)
item.setText(_translate("MainWindow", "Column 4", None))
item = self.tableWidget.horizontalHeaderItem(4)
item.setText(_translate("MainWindow", "Column 5", None))
item = self.tableWidget.horizontalHeaderItem(5)
item.setText(_translate("MainWindow", "New Column", None))
item = self.tableWidget.horizontalHeaderItem(6)
item.setText(_translate("MainWindow", "Column 7", None))
main.py
#!/usr/bin/env python
import sys
from PyQt4 import QtGui
import UiFile
class ExampleApp(QtGui.QMainWindow, UiFile.Ui_MainWindow):
def __init__(self, parent=None):
super(ExampleApp, self).__init__(parent)
self.setupUi(self)
self.home()
def home(self):
self.tableWidget.itemChanged.connect(self.my_item_changed_info)
self.add_row_to_ml_table("R1C1", "R1C2", "R1C3", "R1C4", "R1C5", "R1C6", "R1C7")
self.add_row_to_ml_table("R2C1", "R2C2", "R2C3", "R2C4", "R2C5", "R2C6", "R2C7")
self.add_row_to_ml_table("R3C1", "R3C2", "R3C3", "R3C4", "R3C5", "R3C6", "R3C7")
self.add_row_to_ml_table("R4C1", "R4C2", "R4C3", "R4C4", "R4C5", "R4C6", "R4C7")
self.add_row_to_ml_table("R5C1", "R5C2", "R5C3", "R5C4", "R5C5", "R5C6", "R5C7")
self.add_row_to_ml_table("R6C1", "R6C2", "R6C3", "R6C4", "R6C5", "R6C6", "R6C7")
self.add_row_to_ml_table("R7C1", "R7C2", "R7C3", "R7C4", "R7C5", "R7C6", "R7C7")
def add_row_to_ml_table(self, c1, c2, c3, c4, c5, c6, c7):
rowposition = self.tableWidget.rowCount()
self.tableWidget.insertRow(rowposition)
self.tableWidget.setItem(rowposition, 0, QtGui.QTableWidgetItem(c1))
self.tableWidget.setItem(rowposition, 1, QtGui.QTableWidgetItem(c2))
self.tableWidget.setItem(rowposition, 2, QtGui.QTableWidgetItem(c3))
self.tableWidget.setItem(rowposition, 3, QtGui.QTableWidgetItem(c4))
self.tableWidget.setItem(rowposition, 4, QtGui.QTableWidgetItem(c5))
self.tableWidget.setItem(rowposition, 5, QtGui.QTableWidgetItem(c6))
self.tableWidget.setItem(rowposition, 6, QtGui.QTableWidgetItem(c7))
def my_item_changed_info(self, something):
if self.tableWidget.currentRow() != -1:
print("current", self.tableWidget.currentRow(), self.tableWidget.currentColumn())
print(something.row(), something.column())
def closeEvent(self, event):
choice = QtGui.QMessageBox.question(self, 'Xmms2 Skin', 'Do you want to quit the applictaion?', QtGui.QMessageBox.Yes | QtGui.QMessageBox.No)
if choice == QtGui.QMessageBox.Yes:
event.accept()
else:
event.ignore()
def main():
app = QtGui.QApplication(sys.argv)
form = ExampleApp()
form.show()
app.exec_()
if __name__ == '__main__':
main()
所以我需要做的是获取已被拖动的行和被拖放到的行的信息。
根据我所读到的内容,我必须创建 QTableWidget 的子类才能捕获事件。
我可以使用 Qt Designer 做到这一点吗?我首先根据我的编程技能选择了这个,这是一个更复杂的 GUI 布局的一小部分。
【问题讨论】:
-
由于新用户,我认为我无法编辑我的问题,但我发现我可以在 main.py 的第 15 行使用 self.tableWidget.__class__.dropEvent = self.testfunc 来捕捉drop 事件,但无法确定如何检索该行。如果我使用 print(event.source().row() 我得到 TypeError: QTableWidget.row(QTableWidgetItem): not enough arguments
标签: python qt drag-and-drop pyqt4