1

QTableViewの複数の項目/値をtext/excelファイルにコピーして貼り付けるにはどうすればよいですか?コピーする方法 - QStandardItemModelで作成したQTableViewをtext/excelファイルにコピーすると、複数のアイテムを貼り付けることができますか?

マイコード:

tab_table_view = QtGui.QWidget() 
self.Tab.insertTab(0, tab_table_view, self.File_Name) 
self.tableView = QtGui.QTableView(tab_table_view) 
self.tableView.setGeometry(QtCore.QRect(0, 0, 721, 571)) 
self.model = QtGui.QStandardItemModel(self) 
self.tableView.setSelectionMode(QAbstractItemView.ExtendedSelection 

この行self.tableView.setSelectionMode(QAbstractItemView.ExtendedSelectionはQTableViewで複数の項目を選択するのに役立ちますが、私はCCTRL + を行うと、それが唯一の選択の最後の項目または値を貼り付け貼り付けるとき?

私は線self.tableView.setEditTriggers(QAbstractItemView.AllEditTriggers)を見ましたが、これは表の単一項目にのみ適用され、拡張選択は無視されます。

私はこの質問を投稿している2回目です。さて、それが可能かどうか疑問に思っていますか?誰にでも教えてください!

答えて

3

ここでの難しさは、テーブル内の選択されたセルが不連続であり、特定の順序ではないことです。そのため、選択したすべてのセルを含む最小の矩形を計算し、csvライターに渡すのに適したデータ構造を作成します。以下は

これを行い、デモスクリプト(このprevious answerに基づいて - 追加がコメントされています)です:

# add imports 
import sys, csv, io 
import pandas as pd, numpy as np 
from PyQt4 import QtCore, QtGui 

class Window(QtGui.QWidget): 
    def __init__(self): 
     super(Window, self).__init__() 
     self.model = QtGui.QStandardItemModel(self) 
     self.model.setSortRole(QtCore.Qt.UserRole) 
     self.tableView = QtGui.QTableView() 
     self.tableView.setSortingEnabled(True) 
     self.tableView.setModel(self.model) 
     # install event filter 
     self.tableView.installEventFilter(self) 
     self.button = QtGui.QPushButton('Open CSV', self) 
     self.button.clicked.connect(self.handleButton) 
     layout = QtGui.QVBoxLayout(self) 
     layout.addWidget(self.tableView) 
     layout.addWidget(self.button) 

    # add event filter 
    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) 

    # add copy method 
    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 handleButton(self): 
     filters = (
      'CSV files (*.csv *.txt)', 
      'Excel Files (*.xls *.xml *.xlsx *.xlsm)', 
      ) 
     path, filter = QtGui.QFileDialog.getOpenFileNameAndFilter(
      self, 'Open File', '', ';;'.join(filters)) 
     if path: 
      csv = filter.startswith('CSV') 
      if csv: 
       dataframe = pd.read_csv(path) 
      else: 
       dataframe = pd.read_excel(path) 
      self.model.setRowCount(0) 
      dateformat = '%m/%d/%Y' 
      rows, columns = dataframe.shape 
      for row in range(rows): 
       items = [] 
       for column in range(columns): 
        field = dataframe.iat[row, column] 
        if csv and isinstance(field, str): 
         try: 
          field = pd.to_datetime(field, format=dateformat) 
         except ValueError: 
          pass 
        if isinstance(field, pd.tslib.Timestamp): 
         text = field.strftime(dateformat) 
         data = field.timestamp() 
        else: 
         text = str(field) 
         if isinstance(field, np.number): 
          data = field.item() 
         else: 
          data = text 
        item = QtGui.QStandardItem(text) 
        item.setData(data, QtCore.Qt.UserRole) 
        items.append(item) 
       self.model.appendRow(items) 

if __name__ == '__main__': 

    app = QtGui.QApplication(sys.argv) 
    window = Window() 
    window.setGeometry(500, 150, 600, 400) 
    window.show() 
    sys.exit(app.exec_()) 
+0

どうもありがとう!私はこれをやることを諦め始めたばかりでした。 – learncode

関連する問題