2017-02-03 31 views
0

Для начала я уже рассмотрел код ekhumoro на почти похожем предмете Here. Однако, когда я пытаюсь реализовать этот код, у меня получается другой результат. Вместо копирования и вставки всего выбранного мной, он копирует только первую ячейку выбранной строки или строк соответственно. Мне нужно, чтобы пользователи могли выбирать несколько строк или столбцов и вставлять эти значения в excel или notepad. Есть идеи?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 Man, You're Awesome !!! Большое вам спасибо за всю помощь, которую вы мне предоставили. Я не могу выразить, насколько я благодарен. = D –