2014-07-26 2 views
1

헤더를 포함하여 qt 테이블의 선택한 부분을 복사하고 싶습니다. 기본 qt 테이블 복사본은 하나의 셀만 복사하는 반면 전체 선택 항목은 여러 열 및 여러 행이 될 수 있습니다. 나는 여러 장소 (대부분 here)에서 일부 코드를 접합했으며, 헤더가 아닌 셀 (데이터) 만 복사한다는 점을 제외하면 잘 작동하는 것 같습니다. 선택을위한 헤더를 얻는 데 도움이 필요합니다.복사 열 및 행 헤더를 포함한 pyqt 테이블 선택

예를 들어
 col1 col2 
row1 foo bar 
row2 baz qux 

내가 barbux을 선택한 경우, 내가로 복사를하고 싶습니다 :

\t col2\n 
row1 \t bar\n 
row2 \t qux\n 

from PyQt4 import QtGui, QtCore 
import sys 

class MainWidget(QtGui.QWidget): 
    def __init__(self, parent=None): 
     super(MainWidget, self).__init__(parent) 

     self.table = QtGui.QTableWidget(parent=self) 
     self.table.setColumnCount(2) 
     self.table.setRowCount(2) 
     self.table.setHorizontalHeaderLabels(['col1','col2']) 
     self.table.setVerticalHeaderLabels(['row1','row2']) 
     self.table.setItem(0,0,QtGui.QTableWidgetItem('foo')) 
     self.table.setItem(0,1,QtGui.QTableWidgetItem('bar')) 
     self.table.setItem(1,0,QtGui.QTableWidgetItem('baz')) 
     self.table.setItem(1,1,QtGui.QTableWidgetItem('qux')) 

     layout = QtGui.QGridLayout() 
     layout.addWidget(self.table, 1, 0) 
     self.setLayout(layout) 

     self.clip = QtGui.QApplication.clipboard() 


    def keyPressEvent(self, e): 
     if (e.modifiers() & QtCore.Qt.ControlModifier): 
      selected = self.table.selectedRanges() 

      if e.key() == QtCore.Qt.Key_C: #copy 
       s = "" 

       for r in xrange(selected[0].topRow(), selected[0].bottomRow()+1): 
        for c in xrange(selected[0].leftColumn(), selected[0].rightColumn()+1): 
         try: 
          s += str(self.table.item(r,c).text()) + "\t" 
         except AttributeError: 
          s += "\t" 
        s = s[:-1] + "\n" #eliminate last '\t' 
       self.clip.setText(s) 


if __name__ == '__main__': 

    # Initialize the application 
    app = QtGui.QApplication(sys.argv) 
    mw = MainWidget() 
    mw.show() 
    app.exec_() 

샘플 테이블은 다음과 같다 : 여기 내 몸매는 여전 하구나 샘플입니다

실제 케이스에 많은 열과 행이 있습니다. 내 어려움은 선택된 세포의 머리말을 알아내는 데있다. 서식을 다룰 수 있습니다. 어떤 도움이나 제안을 주셔서 감사합니다. 미리 감사드립니다!

+0

세포를 클릭하면 (기본적으로) 굵은 헤더 항목이 아닌 같은 의미를 '선택'으로 변합니다. 머리글 항목을 클릭해도 '선택'되지 않습니다 (관련 행/열만). 선택한 셀에 해당하는 머리글/행 항목 집합을 원하거나 머리글 항목을 직접 선택할 수 있습니까? – mdurant

+0

셀 그룹을 선택할 때 붙여 넣을 때 어떤 데이터인지 알 수 있도록 복사본에 헤더를 포함하고 싶습니다. 내가 원하는 것의 예를 포함하도록 편집하겠습니다. – fantabolous

+0

샘플을 포함하도록 수정되었습니다. 기본적으로 그것은 내가 선택한 것에 대한 헤더를 얻는 방법을 모른다. – fantabolous

답변

3

단서는 헤더 항목에 있습니다

class MainWidget(QtGui.QWidget): 
    def __init__(self, parent=None): 
     super(MainWidget, self).__init__(parent) 

     self.table = QtGui.QTableWidget(parent=self) 
     self.table.setColumnCount(2) 
     self.table.setRowCount(2) 
     self.table.setHorizontalHeaderLabels(['col1','col2']) 
     self.table.setVerticalHeaderLabels(['row1','row2']) 
     self.table.setItem(0,0,QtGui.QTableWidgetItem('foo')) 
     self.table.setItem(0,1,QtGui.QTableWidgetItem('bar')) 
     self.table.setItem(1,0,QtGui.QTableWidgetItem('baz')) 
     self.table.setItem(1,1,QtGui.QTableWidgetItem('qux')) 

     layout = QtGui.QGridLayout() 
     layout.addWidget(self.table, 1, 0) 
     self.setLayout(layout) 

     self.clip = QtGui.QApplication.clipboard() 


    def keyPressEvent(self, e): 
     if (e.modifiers() & QtCore.Qt.ControlModifier): 
      selected = self.table.selectedRanges() 

      if e.key() == QtCore.Qt.Key_C: #copy 
       s = '\t'+"\t".join([str(self.table.horizontalHeaderItem(i).text()) for i in xrange(selected[0].leftColumn(), selected[0].rightColumn()+1)]) 
       s = s + '\n' 

       for r in xrange(selected[0].topRow(), selected[0].bottomRow()+1): 
        s += self.table.verticalHeaderItem(r).text() + '\t' 
        for c in xrange(selected[0].leftColumn(), selected[0].rightColumn()+1): 
         try: 
          s += str(self.table.item(r,c).text()) + "\t" 
         except AttributeError: 
          s += "\t" 
        s = s[:-1] + "\n" #eliminate last '\t' 
       self.clip.setText(s) 
+0

감사합니다. .text()에서 qstring을 반환하고 .join()으로 작업하지 않고 str()으로 변환하면 문제가 발생합니다. 매우 감사. – fantabolous