PyQt4 table 用于从剪贴板插入 table - table 小部件?
PyQt4 table for inserting a table from the clipboard - tableWidget?
我正在寻找可以使用 Qt Designer 或直接使用 PyQt4 生成的 table,其中可以插入从 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_())
现在的问题是必须独立选择每个单元格,并且无法使用此小部件标记多个单元格。
有人对替代小部件或此小部件的 suitable 调整有建议吗?
您需要通过覆盖 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
然后只需解析数据并将其插入table。
我正在寻找可以使用 Qt Designer 或直接使用 PyQt4 生成的 table,其中可以插入从 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_())
现在的问题是必须独立选择每个单元格,并且无法使用此小部件标记多个单元格。 有人对替代小部件或此小部件的 suitable 调整有建议吗?
您需要通过覆盖 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
然后只需解析数据并将其插入table。