用于从剪贴板插入表的PyQt4表 – tableWidget?
我正在寻找一个可以用Qtdevise器生成的表格,或者直接用PyQt4生成一个表格,其中可以插入一个从Excel电子表格中复制的内容。 所以,例如在剪贴板中有这样的东西:
1 5
2 2
3 2
然后粘贴到这样的东西,这样每个数字是在一个不同的单元格:
我有这样的代码:
from PyQt4 import QtCore, QtGui import sys class Ui_MainWindow(QtGui.QMainWindow): def __init__(self): QtGui.QDialog.__init__(self) self.setupUi(self) def setupUi(self, MainWindow): MainWindow.resize(320, 120) self.centralwidget = QtGui.QWidget(MainWindow) self.tableWidget = QtGui.QTableWidget(self.centralwidget) self.tableWidget.setEnabled(True) self.tableWidget.setGeometry(QtCore.QRect(0, 0, 400, 200)) self.tableWidget.setRowCount(3) self.tableWidget.setColumnCount(3) MainWindow.setCentralWidget(self.centralwidget) if __name__ == '__main__': app = QtGui.QApplication(sys.argv) ex = Ui_MainWindow() ex.show() sys.exit(app.exec_())
现在的问题是人们必须独立地select每个单元格,并且使用这个小部件来标记几个单元格是不可能的。 任何人有一个替代小部件的build议或适当的调整这个小部件?
您需要通过重写keyPressEvent
方法并手动处理剪贴板数据来捕获Ctrl-V
键盘事件。
class MyTable(QtGui.QTableWidget): def keyPressEvent(self, event): if event.key() == QtCore.Qt.Key_V and event.modifiers() == QtCore.Qt.ControlModifier: # Check to see if clipboard contains excel data. # Manually process clipboard data and insert # it into the table starting from the selected tableitem ... return super(MyTable, self).keyPressEvent(event)
你可以使用QClipboard
和QMimeData
从剪贴板获取excel数据。
from pprint import pprint clip = QtGui.QApplication.clipboard() mime = clip.mimeData() pprint(mime.formats())
你应该看到这样的东西:
[u'text/html', u'text/plain', u'application/x-qt-windows-mime;value="Csv"', ...
最后一个是excel数据。 Excel会把数据放在几个不同的格式中,你可以检查每一个格式你最喜欢的格式,但是如果你不关心格式化的话,CSV可能是最简单的。
data = mime.data('application/x-qt-windws-mime;value="Csv"') # convert from QByteArray to python string data = str(data.data()) print data
您应该可以看到以csv格式复制的数据。
a,b,c d,e,f
然后parsing数据并将其插入表中。