PyQt4表用于从剪贴板插入表 - tableWidget?

时间:2016-03-11 12:36:28

标签: python excel qt pyqt4

我正在寻找可以使用Qt Designer或直接使用PyQt4生成的表,其中可以插入从Excel电子表格复制的内容。 所以,例如在剪贴板中有这样的东西:

  

1 5

     

2 2

     

3 2

然后将其粘贴到这样的内容中,这样每个数字都在不同的单元格中:

enter image description here

我有以下代码:

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_())

现在的问题是必须独立选择每个单元格,并且不可能使用此小部件标记多个单元格。 有人建议使用替代小部件或适当调整此小部件吗?

1 个答案:

答案 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)

您可以使用QClipboardQMimeData从剪贴板中获取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

然后解析数据并将其插入表中。