2017-02-03 53 views
0

首先,我已經在幾乎相似的主題Here上看過ekhumoro的代碼。但是,當我嘗試實現此代碼時,我得到了不同的結果。不是複製和粘貼我選擇的所有內容,而只是分別複製所選行或行的第一個單元格。我需要用戶能夠選擇多行或多列,並將這些值粘貼到Excel或記事本中。有任何想法嗎?PyQt:QTableView + QSqlTableModel - 將所有選定的行或列複製並粘貼到記事本或Excel中

GUI: enter image description here

代碼:

from PyQt4 import QtCore, QtGui, QtSql 
import sys 
import sqlite3 
import time 
import csv 


import Search # This file holds our MainWindow and all design related things 

# it also keeps events etc that we defined in Qt Designer 
import os 
try: 
    from PyQt4.QtCore import QString 
except ImportError: 
    QString = str 

class TableEditor(QtGui.QMainWindow, Search.Search_MainWindow): 
    def __init__(self, tableName, parent=None): 
     # Explaining super is out of the scope of this article 
     # So please google it if you're not familar with it 
     # Simple reason why we use it here is that it allows us to 
     # access variables, methods etc in the design.py file 
     super(self.__class__, self).__init__() 
     self.setupUi(self) # This is defined in design.py file automatically 
     # It sets up layout and widgets that are defined 
     self.model = QtSql.QSqlTableModel(self) 
     self.model.setTable('CAUTI') 
     self.model.setEditStrategy(QtSql.QSqlTableModel.OnManualSubmit) 
     self.model.select() 
     self.model.setHeaderData(0, QtCore.Qt.Horizontal, "MRN") 
     self.model.setHeaderData(1, QtCore.Qt.Horizontal, "Last Name") 
     self.model.setHeaderData(2, QtCore.Qt.Horizontal, "First Name") 
     self.model.setHeaderData(3, QtCore.Qt.Horizontal, "Date of Event") 
     self.model.setHeaderData(4, QtCore.Qt.Horizontal, "Facility") 
     self.model.setHeaderData(5, QtCore.Qt.Horizontal, "Unit") 
     self.model.setHeaderData(6, QtCore.Qt.Horizontal, "User") 
     #self.tableView.verticalHeader().setVisible(False) 
     self.tableView.setModel(self.model) 
     self.setWindowTitle("HAI Table") 
     self.tableView.setColumnWidth(0,100) 
     self.tableView.setColumnWidth(1,100) 
     self.tableView.setColumnWidth(2,100) 
     self.tableView.setColumnWidth(3,100) 
     self.tableView.setColumnWidth(4,100) 
     self.tableView.setColumnWidth(5,100) 
     self.tableView.setColumnWidth(6,83) 
     self.tableView.setSortingEnabled(True) 
     self.tableView.setDropIndicatorShown(True) 
     self.tableView.setAcceptDrops(True) 
     self.tableView.setDragEnabled(True) 
     self.tableView.setDragDropMode(QtGui.QAbstractItemView.InternalMove) 
     self.tableView.horizontalHeader().setMovable(True)  
     self.tableView.horizontalHeader().setDragEnabled(True) 
     self.clip = QtGui.QApplication.clipboard() 

    ## Note: ** When I unblock this line of code, I get an error. 
     #self.tableView.installEventFilters(self) 




     self.tableView.horizontalHeader().setDragDropMode(QtGui.QAbstractItemView.InternalMove) 
     self.tableView.verticalHeader().setMovable(True) 
     self.tableView.verticalHeader().setDragEnabled(True) 
     self.tableView.verticalHeader().setDragDropMode(QtGui.QAbstractItemView.InternalMove) 
     self.tableView.setSelectionBehavior(QtGui.QTableView.SelectRows) 
     self.submitButton.clicked.connect(self.submit) 
     self.revertButton.clicked.connect(self.model.revertAll) 
     self.quitButton.clicked.connect(self.close) 

     self.tableView.horizontalHeader().setSortIndicatorShown(True) 
     self.tableView.horizontalHeader().setClickable(True) 
    def eventFilter(self, source, event): 
     if (event.type() == QtCore.QEvent.KeyPress and 
      event.matches(QtGui.QKeySequence.Copy)): 
      self.copySelection() 
      return True 
     return super(Window, self).eventFilter(source, event) 

    def copySelection(self): 
     selection = self.tableView.selectedIndexes() 
     if selection: 
      rows = sorted(index.row() for index in selection) 
      columns = sorted(index.column() for index in selection) 
      rowcount = rows[-1] - rows[0] + 1 
      colcount = columns[-1] - columns[0] + 1 
      table = [[''] * colcount for _ in range(rowcount)] 
      for index in selection: 
       row = index.row() - rows[0] 
       column = index.column() - columns[0] 
       table[row][column] = index.data() 
      stream = io.StringIO() 
      csv.writer(stream).writerows(table) 
      QtGui.qApp.clipboard().setText(stream.getvalue()) 

    def flags(self, index): 
     return QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsDragEnabled | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsDropEnabled  


def main(): 
    app = QtGui.QApplication(sys.argv) 
    #app.setStyle("Plastique") 
    db = QtSql.QSqlDatabase.addDatabase('QSQLITE') 
    db.setDatabaseName('HAI.db') 

    editor = TableEditor('CAUTI') 
    editor.show() 
    app.exec_() 


if __name__ == '__main__': 
    main() 

回答

1

你的實現是通過多種方式打破,所以你複製的代碼永遠不會被執行。因此,使用了表格的內置複製功能,該功能不處理多個選定的項目。

我的複製多個表項的原始代碼是here。我想你應該能夠得到您的示例通過更改以下行工作:

from PyQt4 import QtCore, QtGui, QtSql 
# fix imports 
import sys, io 
... 

class TableEditor(QtGui.QMainWindow, Search.Search_MainWindow): 
    def __init__(self, tableName, parent=None): 
     # do not ever use self.__class__ here 
     super(TableEditor, self).__init__() 
     ... 
     # install event-filter properly 
     self.tableView.installEventFilter(self) 

    def eventFilter(self, source, event): 
     ... 
     # call super properly 
     return super(TableEditor, self).eventFilter(source, event) 

很顯然,我不能運行實際示例代碼,所以有可能是我還沒有發現其他錯誤。

+1

@ ekhumoro男人,你真棒!非常感謝你爲我提供的所有幫助。我無法表達我多麼感恩。 = d –

相關問題