2017-10-10 16 views
1

최근 GUI 응용 프로그램을 만들기 위해 PyQt4를 사용하기 시작했습니다. QTableWidget을 사용하는 응용 프로그램을 만들려고했습니다. 그것은 2 열 테이블로 첫 번째 열은 QLineEdit로 설정되고 두 번째 열은 델리게이트를 사용하여 QListWidget으로 설정됩니다 ("설정"은 올바른 용어가 아닐 경우 미안합니다). QListWidget 열의 항목은 목록 출력에서 ​​나옵니다 QFileDialogPyQt4에서 더블 클릭 QTableWidget이 내용을 -1로 설정합니다.

import sys 
from PyQt4.QtGui import * 
from PyQt4 import uic 
from PyQt4.QtCore import * 

qtCreatorFile = "app_name.ui" # UI File designed using QtDesigner 
Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile) 

class DelegateLEdit(QStyledItemDelegate): 
    def createEditor(self, parent, option, index): 
     line_edit = QLineEdit(parent) 
     return line_edit 

class DelegateLWidget(QStyledItemDelegate): 
    def createEditor(self, parent, option, index): 
     list_widget = QListWidget(parent) 
     list_widget.setSelectionMode(QAbstractItemView.ExtendedSelection) 
     return list_widget 

모든 것이 한 가지를 제외하고 잘 작동하는 것 같다의. 나는 QListWidget 열에서 셀을 클릭을 두 번 할 때마다, 특정 셀의 내용은 -1로 설정됩니다. 내가 처리하지 않은 " doubleClicked "신호를 사용합니다. 내가했을 때 (나는 그것을 텍스트 브라우저에서 셀의 내용을 인쇄하게 만들었습니다.) 셀을 두 번 클릭하면 내용을 -1로 설정할 수 있습니다. 아무도 도와 주실 수 있습니까? QTableWidget 설명서를 읽으려고했지만 어떤 성공을 찾지 못했습니다. 누군가 제가 누락 된 부분을 지적 해 주시겠습니까? 가 여기 내 Form 클래스의 초기화 기능입니다

def __init__(self): 
    QMainWindow.__init__(self) 
    Ui_MainWindow.__init__(self) 
    self.setupUi(self) 
    self.setWindowFlags(Qt.WindowMinimizeButtonHint) 
    self.list_widget = QListWidget() 
    self.add_button.clicked.connect(self.add_to_list) 
    # self.table.itemDoubleClicked.connect(self.print_cell_content) 

    self.table.setColumnCount(2) 

    first_header = "Option" 
    second_header = "Directories" 

    header = first_header + ";" + second_header 
    self.table.setHorizontalHeaderLabels(header.split(";")) 
    header = self.table.horizontalHeader() 

    header.setResizeMode(1, QHeaderView.ResizeToContents) 

    self.table.resizeColumnsToContents() 
    # self.table.setShowGrid(False) 

    self.delegate_lw = DelegateLWidget(self) 
    self.delegate_le = DelegateLEdit(self) 

    self.table.setItemDelegateForColumn(0, self.delegate_le) 
    self.table.setItemDelegateForColumn(1, self.delegate_lw) 

편집 : 테이블의 두 번째 컬럼에 파일을 추가 추가 버튼 핸들러

def add_to_list(self): 

    file_dialog = QFileDialog(self) 
    file_dialog.saveState() 
    file_dialog.setOption(QFileDialog.DontUseNativeDialog, True) 


    file_list = file_dialog.getOpenFileNames() 
    self.dir_list.extend(file_list) 
    self.dir_list = list(set(self.dir_list)) 
    self.add_items(self.dir_list) 

def add_items(self, list_items): 
    list_items.sort() 
    column = 1 
    self.row_count = 0 
    for item in list_items: 
     self.table.insertRow(self.row_count) 
     self.table.setItem(self.row_count, column, QTableWidgetItem(item)) 
     self.row_count += 1 

+0

편집 할 때. 그게 네가 정말로 원하는거야? 또는 실제로 언제든지 볼 수있는 항목 위젯을 설정 하시겠습니까? 셀을 더블 클릭 할 때 어떤 일이 발생할 것으로 예상됩니까? – eyllanesc

+0

에 항목을 추가하는 방법을 보여 수 – ekhumoro

+0

@ekhumoro 예, 실제로 편집 할 때 위젯을 표시하고 싶습니다. 문제는 목록 위젯에 item-delegate를 사용하고있는 두 번째 열에서 발생합니다. 해당 열의 셀을 두 번 클릭하면 해당 셀의 값이 -1로 다시 설정됩니다. 나는 그 것을 피하기를 희망하고있다 – 0Nicholas

답변

1

당신이 필요로하는 감사 모델의 데이터를 저장 및 검색하려면 대리자에 setEditorDatasetModelData을 구현해야합니다. 목록 위젯 열의 경우 기본 동작은 현재 색인을 표시하는 것이며 빈 목록의 경우 -1이됩니다. 여기

은 대리자 클래스가 어떻게 보일지입니다 :

class DelegateLEdit(QStyledItemDelegate): 
    def createEditor(self, parent, option, index): 
     line_edit = QLineEdit(parent) 
     return line_edit 

    def setEditorData(self, editor, index): 
     editor.setText(index.data()) 

    def setModelData(self, editor, model, index): 
     model.setData(index, editor.text()) 

class DelegateLWidget(QStyledItemDelegate): 
    def createEditor(self, parent, option, index): 
     list_widget = QListWidget(parent) 
     list_widget.setSelectionMode(QAbstractItemView.ExtendedSelection) 
     list_widget.addItems('One Two Three Four'.split()) # or whatever 
     return list_widget 

    def setEditorData(self, editor, index): 
     for line in index.data().splitlines(): 
      for item in editor.findItems(line, Qt.MatchExactly): 
       item.setSelected(True) 

    def setModelData(self, editor, model, index): 
     text = '\n'.join(item.text() for item in editor.selectedItems()) 
     model.setData(index, text) 
당신은 당신 만 볼 수있는 사용자 정의 편집기를 제공하기 위해 아이템 대리자를 사용하는 것 같다 테이블
+0

고마워요. 이것은 내 문제의 큰 부분을 해결했다. 내 필요에 맞게 코드를 약간 수정했지만 지금은 다른 문제에 직면하고 있습니다. list_widget에서 항목을 두 번 클릭하면 다른 항목을 클릭하면 사라지고 다시 돌아옵니다. 그게 일어날 거니? Form 클래스 에서 행해진 것처럼'list_widget.addItems()'가 삭제되고 라인이 'line = index.data()'로 변경되었습니다. 두 경우 모두 editor.findItems()는 len 0 – 0Nicholas

+0

@ 0Nicholas의 목록을 제공합니다. 'addItems'을 제거했다면 어떻게 목록을 채우고 있습니까? 목록에서 ** 하나 ** 항목 만 선택 하시겠습니까? 그렇다면 콤보 상자가 편집기 위젯의 훨씬 더 좋은 선택이 될 것입니다. – ekhumoro

+0

'add_to_list()'메소드에 연결된 QPushButton을 추가했습니다. 나는 질문을 편집하고 같은 코드를 추가했다. 그것은 목록 위젯을 채우는 나쁜 방법입니까? – 0Nicholas