add create function

This commit is contained in:
2025-09-03 21:24:08 +02:00
parent 9b2101ba0b
commit a976750d71
6 changed files with 542 additions and 11 deletions

View File

@@ -48,26 +48,52 @@ class MainWindow(QMainWindow):
main_layout = QHBoxLayout(central_widget) main_layout = QHBoxLayout(central_widget)
self.setCentralWidget(central_widget) self.setCentralWidget(central_widget)
pink_widget = PlaceholderWidget("Pink", "#8A004C" , central_widget) # Main splitter
self.view_splitter = self._create_main_content_area()
# Settings panel
self.settings_panel = self._create_settings_panel()
main_layout.addWidget(self.view_splitter)
main_layout.addWidget(self.settings_panel)
def _create_main_content_area(self) -> QWidget:
# main_panel = QWidget()
view_splitter = QSplitter(Qt.Orientation.Horizontal)
pink_widget = PlaceholderWidget("Pink", "#8A004C")
pink_widget.set_text_color("#FFFFFF") pink_widget.set_text_color("#FFFFFF")
gray_widget = PlaceholderWidget("Gray", "#808080", central_widget) gray_widget = PlaceholderWidget("Gray", "#808080")
gray_widget.set_text_color("#FFFFFF") gray_widget.set_text_color("#FFFFFF")
purple_widget = PlaceholderWidget("Purple", "#800080", central_widget) purple_widget = PlaceholderWidget("Purple", "#800080")
purple_widget.set_text_color("#FFFFFF") purple_widget.set_text_color("#FFFFFF")
green_widget = PlaceholderWidget("Green", "#008000", central_widget) view_splitter.addWidget(pink_widget)
view_splitter.addWidget(gray_widget)
view_splitter.addWidget(purple_widget)
view_splitter.setSizes([0, 1, 0])
return view_splitter
def _create_settings_panel(self) -> QWidget:
settings_panel = QWidget()
settings_layout = QVBoxLayout(settings_panel)
green_widget = PlaceholderWidget("Green", "#008000")
green_widget.set_text_color("#FFFFFF") green_widget.set_text_color("#FFFFFF")
green_widget.setMinimumWidth(400)
green_widget.setMinimumHeight(200)
self.view_splitter = QSplitter(Qt.Orientation.Horizontal) settings_layout.addWidget(QLabel("Ustawienia"))
self.view_splitter.addWidget(pink_widget) settings_layout.addWidget(green_widget)
self.view_splitter.addWidget(gray_widget) settings_layout.addStretch()
self.view_splitter.addWidget(purple_widget)
self.view_splitter.setSizes([0, 1, 0]) # Początkowy podział na pół return settings_panel
main_layout.addWidget(self.view_splitter)
main_layout.addWidget(green_widget)

131
color_custom_filter.py Normal file
View File

@@ -0,0 +1,131 @@
from PySide6.QtWidgets import (
QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLabel,
QListView, QLineEdit, QAbstractItemView
)
from PySide6.QtGui import QPixmap, QColor, QStandardItemModel, QStandardItem
from PySide6.QtCore import Qt, QSortFilterProxyModel, QSize
import sys
def color_pixmap(color: QColor, size: int = 32) -> QPixmap:
pixmap = QPixmap(size, size)
pixmap.fill(color)
return pixmap
class ColorItemWidget(QWidget):
"""Widget do wyświetlania koloru + nazwy + modelu"""
def __init__(self, name: str, model: str, color: str):
super().__init__()
layout = QHBoxLayout(self)
layout.setContentsMargins(4, 2, 4, 2)
# ikona koloru
icon_label = QLabel()
icon_label.setPixmap(color_pixmap(QColor(color)))
layout.addWidget(icon_label)
# tekst: kolor + model (jeden pod drugim)
text_layout = QVBoxLayout()
name_label = QLabel(name)
name_label.setStyleSheet("font-weight: bold;")
model_label = QLabel(f"Model: {model}")
model_label.setStyleSheet("color: gray; font-size: 10pt;")
text_layout.addWidget(name_label)
text_layout.addWidget(model_label)
layout.addLayout(text_layout)
class MultiFilterProxy(QSortFilterProxyModel):
"""Proxy do filtrowania po nazwie koloru lub modelu"""
def __init__(self):
super().__init__()
self.search_text = ""
def setSearchText(self, text: str):
self.search_text = text.lower()
self.invalidateFilter()
def filterAcceptsRow(self, source_row: int, source_parent) -> bool:
model = self.sourceModel()
index = model.index(source_row, 0, source_parent)
color_name = model.data(index, Qt.DisplayRole) # nazwa koloru
model_name = model.data(index, Qt.UserRole) # model
if not self.search_text:
return True
return (
self.search_text in color_name.lower()
or self.search_text in model_name.lower()
)
class CustomListApp(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("Customowa lista kolorów z filtrowaniem")
layout = QVBoxLayout(self)
# Pole filtrowania
self.filter_edit = QLineEdit()
self.filter_edit.setPlaceholderText("Filtruj po kolorze lub modelu...")
self.filter_edit.textChanged.connect(self.apply_filter)
layout.addWidget(self.filter_edit)
# Lista widoku
self.list_view = QListView()
self.list_view.setSelectionMode(QAbstractItemView.SingleSelection)
layout.addWidget(self.list_view)
# Model danych
self.model = QStandardItemModel()
colors = [
("Żółty", "#FFFF00", "r1"),
("Zielony", "#00FF00", "r1"),
("Różowy", "#FF69B4", "r2"),
("Niebieski", "#0000FF", "r2"),
("Czerwony", "#FF0000", "r3"),
]
for name, hex_code, model in colors:
item = QStandardItem(name) # DisplayRole = nazwa koloru
item.setData(model, Qt.UserRole) # UserRole = model
item.setData(hex_code, Qt.UserRole + 1) # dodatkowo zapisuję kolor
item.setSizeHint(QSize(150, 50)) # wysokość wiersza
self.model.appendRow(item)
# Proxy do filtrowania
self.proxy_model = MultiFilterProxy()
self.proxy_model.setSourceModel(self.model)
self.list_view.setModel(self.proxy_model)
# Wstawiamy custom widgety zamiast domyślnego tekstu
self.refresh_widgets()
def refresh_widgets(self):
for row in range(self.proxy_model.rowCount()):
index = self.proxy_model.index(row, 0)
color_name = index.data(Qt.DisplayRole)
model_name = index.data(Qt.UserRole)
color_hex = index.data(Qt.UserRole + 1)
widget = ColorItemWidget(color_name, model_name, color_hex)
self.list_view.setIndexWidget(index, widget)
def apply_filter(self, text: str):
self.proxy_model.setSearchText(text)
self.refresh_widgets()
if __name__ == "__main__":
app = QApplication(sys.argv)
window = CustomListApp()
window.show()
sys.exit(app.exec())

132
color_custom_filter2.py Normal file
View File

@@ -0,0 +1,132 @@
from PySide6.QtWidgets import (
QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLabel,
QListView, QLineEdit, QAbstractItemView
)
from PySide6.QtGui import QPixmap, QColor, QStandardItemModel, QStandardItem
from PySide6.QtCore import Qt, QSortFilterProxyModel, QSize
import sys
def color_pixmap(color: QColor, size: int = 32) -> QPixmap:
pixmap = QPixmap(size, size)
pixmap.fill(color)
return pixmap
class ColorItemWidget(QWidget):
"""Widget do wyświetlania koloru + nazwy + modelu"""
def __init__(self, name: str, model: str, color: str):
super().__init__()
layout = QHBoxLayout(self)
layout.setContentsMargins(4, 2, 4, 2)
# ikona koloru
icon_label = QLabel()
icon_label.setPixmap(color_pixmap(QColor(color)))
layout.addWidget(icon_label)
# tekst: kolor + model (jeden pod drugim)
text_layout = QVBoxLayout()
name_label = QLabel(name)
name_label.setStyleSheet("font-weight: bold;")
model_label = QLabel(f"Model: {model}")
model_label.setStyleSheet("color: gray; font-size: 10pt;")
text_layout.addWidget(name_label)
text_layout.addWidget(model_label)
layout.addLayout(text_layout)
class MultiFilterProxy(QSortFilterProxyModel):
"""Proxy do filtrowania po nazwie koloru lub modelu"""
def __init__(self):
super().__init__()
self.search_text = ""
def setSearchText(self, text: str):
self.search_text = text.lower()
self.invalidateFilter()
def filterAcceptsRow(self, source_row: int, source_parent) -> bool:
model = self.sourceModel()
index = model.index(source_row, 0, source_parent)
color_name = model.data(index, Qt.UserRole + 2) # nazwa
model_name = model.data(index, Qt.UserRole) # model
if not self.search_text:
return True
return (
self.search_text in color_name.lower()
or self.search_text in model_name.lower()
)
class CustomListApp(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("Customowa lista kolorów z filtrowaniem")
layout = QVBoxLayout(self)
# Pole filtrowania
self.filter_edit = QLineEdit()
self.filter_edit.setPlaceholderText("Filtruj po kolorze lub modelu...")
self.filter_edit.textChanged.connect(self.apply_filter)
layout.addWidget(self.filter_edit)
# Lista widoku
self.list_view = QListView()
self.list_view.setSelectionMode(QAbstractItemView.SingleSelection)
layout.addWidget(self.list_view)
# Model danych
self.model = QStandardItemModel()
colors = [
("Żółty", "#FFFF00", "r1"),
("Zielony", "#00FF00", "r1"),
("Różowy", "#FF69B4", "r2"),
("Niebieski", "#0000FF", "r2"),
("Czerwony", "#FF0000", "r3"),
]
for name, hex_code, model in colors:
item = QStandardItem()
item.setData(model, Qt.UserRole) # model
item.setData(hex_code, Qt.UserRole+1) # kolor
item.setData(name, Qt.UserRole+2) # nazwa
item.setSizeHint(QSize(150, 50)) # wysokość wiersza
self.model.appendRow(item)
# Proxy do filtrowania
self.proxy_model = MultiFilterProxy()
self.proxy_model.setSourceModel(self.model)
self.list_view.setModel(self.proxy_model)
# Wstawiamy custom widgety zamiast domyślnego tekstu
self.refresh_widgets()
def refresh_widgets(self):
for row in range(self.proxy_model.rowCount()):
index = self.proxy_model.index(row, 0)
color_name = index.data(Qt.UserRole+2)
model_name = index.data(Qt.UserRole)
color_hex = index.data(Qt.UserRole+1)
widget = ColorItemWidget(color_name, model_name, color_hex)
self.list_view.setIndexWidget(index, widget)
def apply_filter(self, text: str):
self.proxy_model.setSearchText(text)
self.refresh_widgets()
if __name__ == "__main__":
app = QApplication(sys.argv)
window = CustomListApp()
window.show()
sys.exit(app.exec())

View File

@@ -0,0 +1,155 @@
from PySide6.QtWidgets import (
QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLineEdit, QListView,
QAbstractItemView, QComboBox, QLabel
)
from PySide6.QtGui import QPixmap, QColor, QStandardItemModel, QStandardItem
from PySide6.QtCore import Qt, QSortFilterProxyModel, QSize
import sys
def color_pixmap(color: QColor, size: int = 32) -> QPixmap:
pixmap = QPixmap(size, size)
pixmap.fill(color)
return pixmap
class ColorItemWidget(QWidget):
"""Widget do wyświetlania koloru + nazwy + modelu"""
def __init__(self, name: str, model: str, color: str):
super().__init__()
layout = QHBoxLayout(self)
layout.setContentsMargins(4, 2, 4, 2)
# ikona koloru
icon_label = QLabel()
icon_label.setPixmap(color_pixmap(QColor(color)))
layout.addWidget(icon_label)
# tekst: kolor + model (jeden pod drugim)
text_layout = QVBoxLayout()
name_label = QLabel(name)
name_label.setStyleSheet("font-weight: bold;")
model_label = QLabel(f"Model: {model}")
model_label.setStyleSheet("color: gray; font-size: 10pt;")
text_layout.addWidget(name_label)
text_layout.addWidget(model_label)
layout.addLayout(text_layout)
class MultiFilterProxy(QSortFilterProxyModel):
"""Proxy do filtrowania po nazwie koloru i modelu"""
def __init__(self):
super().__init__()
self.search_text = ""
self.selected_model = "all"
def setSearchText(self, text: str):
self.search_text = text.lower()
self.invalidateFilter()
def setSelectedModel(self, model: str):
self.selected_model = model.lower()
self.invalidateFilter()
def filterAcceptsRow(self, source_row: int, source_parent) -> bool:
model = self.sourceModel()
index = model.index(source_row, 0, source_parent)
color_name = model.data(index, Qt.UserRole + 2) # nazwa
model_name = model.data(index, Qt.UserRole) # model
# filtr po modelu
if self.selected_model != "all" and model_name.lower() != self.selected_model:
return False
# filtr po nazwie
if self.search_text and self.search_text not in color_name.lower():
return False
return True
class CustomListApp(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("Lista kolorów z filtrem po nazwie i modelu")
layout = QVBoxLayout(self)
# Górny panel z filtrami
filter_layout = QHBoxLayout()
self.filter_edit = QLineEdit()
self.filter_edit.setPlaceholderText("Szukaj po nazwie koloru...")
self.filter_edit.textChanged.connect(self.apply_text_filter)
filter_layout.addWidget(QLabel("Nazwa:"))
filter_layout.addWidget(self.filter_edit)
self.model_combo = QComboBox()
self.model_combo.addItems(["all", "r1", "r2", "r3"])
self.model_combo.currentTextChanged.connect(self.apply_model_filter)
filter_layout.addWidget(QLabel("Model:"))
filter_layout.addWidget(self.model_combo)
layout.addLayout(filter_layout)
# Lista widoku
self.list_view = QListView()
self.list_view.setSelectionMode(QAbstractItemView.SingleSelection)
layout.addWidget(self.list_view)
# Model danych
self.model = QStandardItemModel()
colors = [
("Żółty", "#FFFF00", "r1"),
("Zielony", "#00FF00", "r1"),
("Różowy", "#FF69B4", "r2"),
("Niebieski", "#0000FF", "r2"),
("Czerwony", "#FF0000", "r3"),
]
for name, hex_code, model in colors:
item = QStandardItem()
item.setData(model, Qt.UserRole) # model
item.setData(hex_code, Qt.UserRole+1) # kolor
item.setData(name, Qt.UserRole+2) # nazwa
item.setSizeHint(QSize(150, 50)) # wysokość wiersza
self.model.appendRow(item)
# Proxy do filtrowania
self.proxy_model = MultiFilterProxy()
self.proxy_model.setSourceModel(self.model)
self.list_view.setModel(self.proxy_model)
# Wstawiamy custom widgety
self.refresh_widgets()
def refresh_widgets(self):
for row in range(self.proxy_model.rowCount()):
index = self.proxy_model.index(row, 0)
color_name = index.data(Qt.UserRole+2)
model_name = index.data(Qt.UserRole)
color_hex = index.data(Qt.UserRole+1)
widget = ColorItemWidget(color_name, model_name, color_hex)
self.list_view.setIndexWidget(index, widget)
def apply_text_filter(self, text: str):
self.proxy_model.setSearchText(text)
self.refresh_widgets()
def apply_model_filter(self, model: str):
self.proxy_model.setSelectedModel(model)
self.refresh_widgets()
self.model_combo.hidePopup()
if __name__ == "__main__":
app = QApplication(sys.argv)
window = CustomListApp()
window.show()
sys.exit(app.exec())

29
color_list.py Normal file
View File

@@ -0,0 +1,29 @@
from PySide6.QtWidgets import QApplication, QListWidget, QListWidgetItem
from PySide6.QtGui import QPixmap, QIcon, QColor
import sys
def color_icon(color: QColor, size: int = 32) -> QIcon:
"""Tworzy ikonę z prostokątem w danym kolorze."""
pixmap = QPixmap(size, size)
pixmap.fill(color)
return QIcon(pixmap)
app = QApplication(sys.argv)
list_widget = QListWidget()
list_widget.setIconSize(list_widget.iconSize().expandedTo(list_widget.iconSize()))
# Lista kolorów (nazwa, hex)
colors = [
("Czerwony", "#FF0000"),
("Zielony", "#00FF00"),
("Niebieski", "#0000FF"),
("Żółty", "#FFFF00"),
]
for name, hex_code in colors:
item = QListWidgetItem(color_icon(QColor(hex_code)), name)
list_widget.addItem(item)
list_widget.show()
sys.exit(app.exec())

58
color_list_filter.py Normal file
View File

@@ -0,0 +1,58 @@
from PySide6.QtWidgets import (
QApplication, QWidget, QVBoxLayout, QListWidget, QListWidgetItem,
QLineEdit, QLabel
)
from PySide6.QtGui import QPixmap, QIcon, QColor
import sys
def color_icon(color: QColor, size: int = 24) -> QIcon:
pixmap = QPixmap(size, size)
pixmap.fill(color)
return QIcon(pixmap)
class ColorFilterApp(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("Lista kolorów z filtrowaniem")
layout = QVBoxLayout(self)
self.filter_edit = QLineEdit()
self.filter_edit.setPlaceholderText("Filtruj po modelu...")
self.filter_edit.textChanged.connect(self.apply_filter)
layout.addWidget(QLabel("Filtruj:"))
layout.addWidget(self.filter_edit)
self.list_widget = QListWidget()
layout.addWidget(self.list_widget)
# Dane: kolor + model
self.colors = [
("Żółty", "#FFFF00", "r1"),
("Zielony", "#00FF00", "r1"),
("Różowy", "#FF69B4", "r2"),
("Niebieski", "#0000FF", "r2"),
("Czerwony", "#FF0000", "r3"),
]
# Dodajemy elementy
for name, hex_code, model in self.colors:
item = QListWidgetItem(color_icon(QColor(hex_code)), f"{name} (model: {model})")
item.setData(256, model) # zapisz model jako dodatkowe dane
self.list_widget.addItem(item)
def apply_filter(self, text: str):
"""Filtruj elementy po modelu"""
for i in range(self.list_widget.count()):
item = self.list_widget.item(i)
model = item.data(256) # pobierz zapisany model
item.setHidden(text.lower() not in model.lower())
if __name__ == "__main__":
app = QApplication(sys.argv)
window = ColorFilterApp()
window.show()
sys.exit(app.exec())