import sys
from functools import partial
from typing import Optional
from PyQt5 import QtCore
Qt
def __init__
(self, parent
: Optional
[QObject] = None
) -> None
: super().__init__(parent=parent)
self.headers = ['Nummer', 'Name', 'Gemeinde']
self.data = [
('010006', 'Alt Duvenstedt', 'Alt Duvenstedt'),
('010010', 'Altenhof', 'Altenhof'),
('010012', 'Altwickenbeck (Neuw)', 'Neuwittenbeck'),
('010021', 'Bargstedt', 'Bargstedt'),
('010023', 'Barkelsby', 'Barkelsby'),
('010024', 'Basdorf (Rie)', 'Rieseby'),
]
def headerData(self, section: int, orientation: Qt.Orientation, role: int = ...):
if orientation == Qt.Horizontal and role == Qt.DisplayRole:
return self.headers[section]
def columnCount
(self, parent
: QModelIndex = ...
) ->
int: return len(self.headers)
return len(self.data)
if role == Qt.DisplayRole:
return self.data[index.row()][index.column()]
def __init__
(self, parent
: Optional
[QWidget] = None
) -> None
: super().__init__(parent=parent)
self.setFocusPolicy(Qt.StrongFocus)
# self.setEditable(True)
# self.filterModel = QSortFilterProxyModel(self)
# self.filterModel.setFilterCaseSensitivity(Qt.CaseInsensitive)
self.setView(self.tableView)
self.tableView.setSortingEnabled(True)
self.tableView.setAutoScroll(False)
self.tableView.horizontalHeader().setStretchLastSection(True)
self.tableView.verticalHeader().hide()
# self.completer = QCompleter(self)
# self.completer.setCompletionMode(QCompleter.UnfilteredPopupCompletion)
# self.completer.setPopup(self.tableView)
# self.completer.setModel(self.filterModel)
# self.setCompleter(self.completer)
# self.lineEdit().textEdited.connect(self.filterModel.setFilterFixedString)
# self.completer.activated.connect(self.onCompleterActivated)
super().setModel(model)
# self.filterModel.setSourceModel(model)
# self.completer.setModel(self.filterModel)
self.tableView.resizeColumnsToContents()
self.tableView.resizeRowsToContents()
self.tableView.setMinimumWidth(self.tableView.horizontalHeader().length())
self.setMinimumWidth(100)
def setModelColumn(self, column):
super().setModelColumn(column)
# self.filterModel.setFilterKeyColumn(column)
# self.completer.setCompletionColumn(column)
# def onCompleterActivated(self, text):
# if text:
# index = self.findText(str(text))
# self.setCurrentIndex(index)
def setModelIndex
(index
: int, target
: QComboBox): target.blockSignals(True)
target.setCurrentIndex(index)
target.blockSignals(False)
if __name__ == '__main__':
model = MyModel()
sortModel.setFilterCaseSensitivity(Qt.CaseInsensitive)
sortModel.sort(1, Qt.AscendingOrder)
sortModel.setSourceModel(model)
combobox = MyCombobox()
combobox.setModel(sortModel)
combobox.setModelColumn(0)
combobox2 = MyCombobox()
combobox2.setModel(sortModel)
combobox2.setModelColumn(1)
combobox.currentIndexChanged.connect(partial(setModelIndex, target=combobox2))
combobox2.currentIndexChanged.connect(partial(setModelIndex, target=combobox))
layout.
addWidget(QLabel('Nummer')) layout.addWidget(combobox)
layout.
addWidget(QLabel('Name')) layout.addWidget(combobox2)
layout.addStretch(10)
widget.setWindowTitle('Synchronized comboboxes with shared model')
widget.setFixedWidth(500)
widget.setLayout(layout)
widget.show()
sys.exit(app.exec_())
import sys
from functools import partial
from typing import Optional
from PyQt5 import QtCore
from PyQt5.QtCore import QAbstractTableModel, QModelIndex, QObject, QSortFilterProxyModel, QVariant, \
Qt
from PyQt5.QtWidgets import QAbstractItemView, QApplication, QComboBox, QHBoxLayout, QLabel, QTableView, \
QWidget
class MyModel(QAbstractTableModel):
def __init__(self, parent: Optional[QObject] = None) -> None:
super().__init__(parent=parent)
self.headers = ['Nummer', 'Name', 'Gemeinde']
self.data = [
('010006', 'Alt Duvenstedt', 'Alt Duvenstedt'),
('010010', 'Altenhof', 'Altenhof'),
('010012', 'Altwickenbeck (Neuw)', 'Neuwittenbeck'),
('010021', 'Bargstedt', 'Bargstedt'),
('010023', 'Barkelsby', 'Barkelsby'),
('010024', 'Basdorf (Rie)', 'Rieseby'),
]
def headerData(self, section: int, orientation: Qt.Orientation, role: int = ...):
if orientation == Qt.Horizontal and role == Qt.DisplayRole:
return self.headers[section]
def columnCount(self, parent: QModelIndex = ...) -> int:
return len(self.headers)
def rowCount(self, parent: QModelIndex = ...) -> int:
return len(self.data)
def data(self, index: QModelIndex, role: int = ...):
if role == Qt.DisplayRole:
return self.data[index.row()][index.column()]
return QVariant()
class MyCombobox(QComboBox):
def __init__(self, parent: Optional[QWidget] = None) -> None:
super().__init__(parent=parent)
self.setFocusPolicy(Qt.StrongFocus)
# self.setEditable(True)
# self.filterModel = QSortFilterProxyModel(self)
# self.filterModel.setFilterCaseSensitivity(Qt.CaseInsensitive)
self.tableView = QTableView(self)
self.setView(self.tableView)
self.tableView.setSelectionMode(QAbstractItemView.SingleSelection)
self.tableView.setSelectionBehavior(QAbstractItemView.SelectRows)
self.tableView.setSortingEnabled(True)
self.tableView.setAutoScroll(False)
self.tableView.horizontalHeader().setStretchLastSection(True)
self.tableView.verticalHeader().hide()
# self.completer = QCompleter(self)
# self.completer.setCompletionMode(QCompleter.UnfilteredPopupCompletion)
# self.completer.setPopup(self.tableView)
# self.completer.setModel(self.filterModel)
# self.setCompleter(self.completer)
# self.lineEdit().textEdited.connect(self.filterModel.setFilterFixedString)
# self.completer.activated.connect(self.onCompleterActivated)
def setModel(self, model: QtCore.QAbstractItemModel) -> None:
super().setModel(model)
# self.filterModel.setSourceModel(model)
# self.completer.setModel(self.filterModel)
self.tableView.resizeColumnsToContents()
self.tableView.resizeRowsToContents()
self.tableView.setMinimumWidth(self.tableView.horizontalHeader().length())
self.setMinimumWidth(100)
def setModelColumn(self, column):
super().setModelColumn(column)
# self.filterModel.setFilterKeyColumn(column)
# self.completer.setCompletionColumn(column)
# def onCompleterActivated(self, text):
# if text:
# index = self.findText(str(text))
# self.setCurrentIndex(index)
def setModelIndex(index: int, target: QComboBox):
target.blockSignals(True)
target.setCurrentIndex(index)
target.blockSignals(False)
if __name__ == '__main__':
app = QApplication(sys.argv)
model = MyModel()
sortModel = QSortFilterProxyModel()
sortModel.setFilterCaseSensitivity(Qt.CaseInsensitive)
sortModel.sort(1, Qt.AscendingOrder)
sortModel.setSourceModel(model)
combobox = MyCombobox()
combobox.setModel(sortModel)
combobox.setModelColumn(0)
combobox2 = MyCombobox()
combobox2.setModel(sortModel)
combobox2.setModelColumn(1)
combobox.currentIndexChanged.connect(partial(setModelIndex, target=combobox2))
combobox2.currentIndexChanged.connect(partial(setModelIndex, target=combobox))
widget = QWidget()
layout = QHBoxLayout()
layout.addWidget(QLabel('Nummer'))
layout.addWidget(combobox)
layout.addWidget(QLabel('Name'))
layout.addWidget(combobox2)
layout.addStretch(10)
widget.setWindowTitle('Synchronized comboboxes with shared model')
widget.setFixedWidth(500)
widget.setLayout(layout)
widget.show()
sys.exit(app.exec_())
To copy to clipboard, switch view to plain text mode
Bookmarks