2017-08-08 15 views
2

QComboBoxのボタンを使用してQListViewボタンが必要ですが、書き込み代理人は非常に苦痛です。私はQTableViewを選んだのですが、常に各行に同じボタンがあるためです。私の唯一の問題は、QComboBoxの中からclicked信号を捕まえることができないということです。QComboBoxのビューであるQTableViewのクリック信号

私は私が何を意味するか説明するMWEを添付:

from PyQt5.QtCore import QModelIndex, Qt, QAbstractTableModel, QVariant 
from PyQt5.QtWidgets import QApplication, QComboBox, QTableView, QWidget, QVBoxLayout 


class Model(QAbstractTableModel): 
    def data(self, index, role=Qt.DisplayRole): 
     if role == Qt.DisplayRole: 
      col = index.column() 
      if col == 0: 
       return str(index.row()) 
      elif col == 1: 
       return '✎' 
      elif col == 2: 
       return '✘' 
     return QVariant() 

    def columnCount(self, parent=QModelIndex()): 
     return 3 

    def rowCount(self, parent=QModelIndex()): 
     return 5 


if __name__ == '__main__': 
    import sys 

    app = QApplication(sys.argv) 
    model = Model() 

    main = QWidget() 
    layout = QVBoxLayout(main) 

    view = QTableView() 
    view.clicked.connect(lambda _: print('Click Table')) # Works fine 
    view.setModel(model) 
    layout.addWidget(view) 

    combo = QComboBox() 
    combo.setModel(model) 
    combo.setView(QTableView()) 
    combo.view().clicked.connect(lambda _: print('Click Combo')) # Does'nt show 
    layout.addWidget(combo) 

    main.resize(500, 300) 
    main.show() 
    sys.exit(app.exec_()) 

答えて

2

あなたはコンボボックスでクリックをトリガするために、次の信号を使用することができます。

view = QTableView() 
view.clicked.connect(lambda: print('Click Table')) # Works fine 
view.setModel(model) 
layout.addWidget(view) 

combo = QComboBox() 
combo.setModel(Model()) 
combo.setView(QTableView()) 

combo.activated.connect(lambda: print('Click Combo')) # Works fine too 
layout.addWidget(combo) 

それともときにのみを検出する必要がある場合クリックまたはキーボード入力によって選択項目が変更されます。

combo.currentIndexChanged.connect(lambda: print('Click Combo')) 
+0

ありがとうございます。それは正しい方向性のようです。クリックのインデックスを取得するにはどうすればよいですか? 'combo.activated.connect(lambda ind:print(f'Click Combo {ind} '))'は行だけを返しますが、列は返しません。 –

2

これは、ビューのmousePressEventcombo.activatedシグナル(おかげでPRMoureu)を使用してこれを行います。誰かがそれを使うことができるように私はそれを掲示する。

#!/usr/bin/env python3 

from PyQt5.QtCore import QModelIndex, Qt, QAbstractTableModel, QVariant 
from PyQt5.QtWidgets import QApplication, QComboBox, QTableView, QWidget, QVBoxLayout 


class Model(QAbstractTableModel): 
    DATA = ['0', '1', '2', '3', '4'] 

    def data(self, index, role=Qt.DisplayRole): 
     if role == Qt.DisplayRole: 
      col = index.column() 
      if col == 0: 
       return self.DATA[index.row()] 
      elif col == 1: 
       return '✎' 
      elif col == 2: 
       return '✘' 
     return QVariant() 

    def callback(self, row, col): 
     print(f'Clicked {row}:{col}') 

    def columnCount(self, parent=QModelIndex()): 
     return 3 

    def rowCount(self, parent=QModelIndex()): 
     return 5 


class Table(QTableView): 
    BUTTON_SIZE = 20 
    click_col_index = 0 

    def __init__(self, parent=None): 
     super().__init__(parent) 
     self.horizontalHeader().hide() 
     self.verticalHeader().hide() 

    def resizeEvent(self, event): 
     super().resizeEvent(event) 

     self.setColumnWidth(0, self.width() - 2 * self.BUTTON_SIZE) 
     self.setColumnWidth(1, self.BUTTON_SIZE) 
     self.setColumnWidth(2, self.BUTTON_SIZE) 

    def mousePressEvent(self, event): 
     x = event.localPos().x() 
     width = self.columnWidth(0) 
     self.click_col_index = max([0, (x - width + self.BUTTON_SIZE) // self.BUTTON_SIZE]) 


class SignalMixer: 
    def __init__(self, model, view, combo): 
     self.model = model 
     self.view = view 
     self.combo = combo 

     self.combo.activated.connect(self.clicked) 

    def clicked(self, row): 
     if self.view.click_col_index: 
      self.model.callback(row, self.view.click_col_index) 


if __name__ == '__main__': 
    import sys 

    app = QApplication(sys.argv) 
    model = Model() 

    main = QWidget() 
    layout = QVBoxLayout(main) 

    view = QTableView() 
    view.clicked.connect(lambda _: print('Click Table')) 
    view.setModel(model) 
    layout.addWidget(view) 

    combo = QComboBox() 
    combo.setModel(model) 
    combo.setView(Table()) 
    layout.addWidget(combo) 

    mixer = SignalMixer(model, combo.view(), combo) 

    main.resize(500, 300) 
    main.show() 
    sys.exit(app.exec_()) 
関連する問題