我正在寻找可以使用Qt Designer或直接使用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_())
现在的问题是必须独立选择每个单元格,并且不可能使用此小部件标记多个单元格。 有人建议使用替代小部件或适当调整此小部件吗?
答案 0 :(得分:3)
您需要通过覆盖Ctrl-V
方法并手动处理剪贴板数据来捕获keyPressEvent
键盘事件。
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会将数据以多种不同的格式放入clipbaord中,您可以检查每个格式以查看您最喜欢的格式,但如果您不关心格式化,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
然后解析数据并将其插入表中。