A fluent design widgets library based on PyQt5 providing modern Windows 11-style UI components
—
Quality
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Advanced list, table, and tree components with custom delegates, smooth scrolling, and fluent design integration. These widgets provide modern data presentation with theme support and smooth interactions.
Enhanced list components with fluent design styling and smooth scrolling capabilities.
class ListWidget(QListWidget):
def __init__(self, parent=None): ...
def setItemDelegate(self, delegate: QAbstractItemDelegate): ...
def setBorderVisible(self, visible: bool): ...
def scrollToBottom(self): ...
class ListView(QListView):
def __init__(self, parent=None): ...
def setBorderVisible(self, visible: bool): ...
def setItemDelegate(self, delegate: QAbstractItemDelegate): ...
class CycleListWidget(QListWidget):
def __init__(self, parent=None): ...
def setCurrentIndex(self, index: int): ...
def currentIndex(self) -> int: ...Usage Example:
from qfluentwidgets import ListWidget, ListView, CycleListWidget
# Basic list widget
list_widget = ListWidget(self)
list_widget.setBorderVisible(False)
# Add items
items = ["Item 1", "Item 2", "Item 3", "Item 4"]
for item in items:
list_widget.addItem(item)
# Handle selection
list_widget.itemClicked.connect(self.on_item_clicked)
# Cycling list for navigation
cycle_list = CycleListWidget(self)
cycle_list.addItems(["Option A", "Option B", "Option C"])
cycle_list.setCurrentIndex(0)Enhanced table components with fluent design styling and custom delegates.
class TableWidget(QTableWidget):
def __init__(self, parent=None): ...
def __init__(self, rows: int, columns: int, parent=None): ...
def setBorderVisible(self, visible: bool): ...
def setBorderRadius(self, radius: int): ...
def setWordWrap(self, wrap: bool): ...
def setRowCount(self, rows: int): ...
def setColumnCount(self, columns: int): ...
class TableView(QTableView):
def __init__(self, parent=None): ...
def setBorderVisible(self, visible: bool): ...
def setBorderRadius(self, radius: int): ...Usage Example:
from qfluentwidgets import TableWidget, TableView
from PyQt5.QtCore import QAbstractTableModel
# Basic table widget
table = TableWidget(self)
table.setRowCount(5)
table.setColumnCount(3)
table.setBorderVisible(True)
table.setBorderRadius(8)
# Set headers
table.setHorizontalHeaderLabels(["Name", "Age", "City"])
# Add data
data = [
("John", "25", "New York"),
("Alice", "30", "London"),
("Bob", "28", "Paris")
]
for row, (name, age, city) in enumerate(data):
table.setItem(row, 0, QTableWidgetItem(name))
table.setItem(row, 1, QTableWidgetItem(age))
table.setItem(row, 2, QTableWidgetItem(city))
# Model-based table view
model = CustomTableModel(data)
table_view = TableView(self)
table_view.setModel(model)Hierarchical data display with fluent design styling and smooth animations.
class TreeWidget(QTreeWidget):
def __init__(self, parent=None): ...
def setBorderVisible(self, visible: bool): ...
def setBorderRadius(self, radius: int): ...
def setHeaderHidden(self, hidden: bool): ...
class TreeView(QTreeView):
def __init__(self, parent=None): ...
def setBorderVisible(self, visible: bool): ...
def setBorderRadius(self, radius: int): ...Usage Example:
from qfluentwidgets import TreeWidget, TreeView
from PyQt5.QtWidgets import QTreeWidgetItem
# Tree widget with hierarchical data
tree = TreeWidget(self)
tree.setHeaderLabels(["Name", "Type", "Size"])
tree.setBorderVisible(True)
# Create tree structure
root = QTreeWidgetItem(tree, ["Documents", "Folder", ""])
child1 = QTreeWidgetItem(root, ["Report.pdf", "PDF", "2.5 MB"])
child2 = QTreeWidgetItem(root, ["Data.xlsx", "Excel", "1.2 MB"])
# Expand items
tree.expandAll()
# Handle item clicks
tree.itemClicked.connect(self.on_tree_item_clicked)
# Model-based tree view
tree_view = TreeView(self)
tree_model = CustomTreeModel()
tree_view.setModel(tree_model)Image gallery and content browsing widgets with smooth transitions.
class FlipView(QWidget):
def __init__(self, parent=None): ...
def addItem(self, item: Union[str, QPixmap, QWidget]): ...
def setCurrentIndex(self, index: int): ...
def currentIndex(self) -> int: ...
def next(self): ...
def previous(self): ...
class HorizontalFlipView(FlipView): ...
class VerticalFlipView(FlipView): ...Usage Example:
from qfluentwidgets import FlipView, HorizontalFlipView
# Image flip view
flip_view = HorizontalFlipView(self)
flip_view.setFixedSize(400, 300)
# Add images
images = ["image1.jpg", "image2.jpg", "image3.jpg"]
for image_path in images:
flip_view.addItem(image_path)
# Navigation controls
def next_image():
flip_view.next()
def prev_image():
flip_view.previous()
# Connect to buttons
next_btn.clicked.connect(next_image)
prev_btn.clicked.connect(prev_image)Specialized item delegates for enhanced rendering and editing in list/table/tree widgets.
class ListItemDelegate(QStyledItemDelegate):
def __init__(self, parent=None): ...
def paint(self, painter: QPainter, option: QStyleOptionViewItem, index: QModelIndex): ...
def sizeHint(self, option: QStyleOptionViewItem, index: QModelIndex) -> QSize: ...
class TableItemDelegate(QStyledItemDelegate):
def __init__(self, parent=None): ...
def paint(self, painter: QPainter, option: QStyleOptionViewItem, index: QModelIndex): ...
class TreeItemDelegate(QStyledItemDelegate):
def __init__(self, parent=None): ...
def paint(self, painter: QPainter, option: QStyleOptionViewItem, index: QModelIndex): ...Usage Example:
from qfluentwidgets import ListItemDelegate, TableItemDelegate
# Custom list delegate
class CustomListDelegate(ListItemDelegate):
def paint(self, painter, option, index):
# Custom painting logic
super().paint(painter, option, index)
def sizeHint(self, option, index):
return QSize(200, 40) # Custom item size
# Apply delegate
list_widget = ListWidget(self)
custom_delegate = CustomListDelegate()
list_widget.setItemDelegate(custom_delegate)
# Table delegate
table_delegate = TableItemDelegate()
table_widget.setItemDelegate(table_delegate)from qfluentwidgets import SmoothScrollArea, SmoothMode
# Smooth scrolling for list widgets
scroll_area = SmoothScrollArea(self)
scroll_area.setWidget(list_widget)
scroll_area.setWidgetResizable(True)
scroll_area.setSmoothMode(SmoothMode.COSINE)from PyQt5.QtCore import QItemSelectionModel
# Custom selection handling
selection_model = list_widget.selectionModel()
selection_model.selectionChanged.connect(self.on_selection_changed)
def on_selection_changed(self, selected, deselected):
selected_items = selected.indexes()
print(f"Selected {len(selected_items)} items")from PyQt5.QtCore import QAbstractItemModel
class CustomListModel(QAbstractItemModel):
def __init__(self, data):
super().__init__()
self.data = data
def rowCount(self, parent=QModelIndex()):
return len(self.data)
def data(self, index, role=Qt.DisplayRole):
if role == Qt.DisplayRole:
return self.data[index.row()]
return None
# Use with view widgets
model = CustomListModel(["Item 1", "Item 2", "Item 3"])
list_view = ListView(self)
list_view.setModel(model)List and view widgets automatically adapt to the current theme:
from qfluentwidgets import FluentStyleSheet, isDarkTheme
# Apply fluent styling
FluentStyleSheet.LIST_WIDGET.apply(list_widget)
FluentStyleSheet.TABLE_WIDGET.apply(table_widget)
FluentStyleSheet.TREE_WIDGET.apply(tree_widget)
# Custom styling based on theme
if isDarkTheme():
custom_style = """
QListWidget {
background-color: #2b2b2b;
border: 1px solid #3c3c3c;
}
QListWidget::item:selected {
background-color: #0078d4;
}
"""
else:
custom_style = """
QListWidget {
background-color: white;
border: 1px solid #e0e0e0;
}
QListWidget::item:selected {
background-color: #0078d4;
}
"""
list_widget.setStyleSheet(custom_style)# Use model-based views for large datasets
large_model = CustomListModel(large_dataset)
list_view = ListView(self)
list_view.setModel(large_model)
# Enable uniform item sizes for performance
list_view.setUniformItemSizes(True)class LazyLoadModel(QAbstractItemModel):
def __init__(self):
super().__init__()
self.cached_data = {}
def data(self, index, role=Qt.DisplayRole):
# Load data on demand
if index.row() not in self.cached_data:
self.cached_data[index.row()] = self.load_item(index.row())
return self.cached_data[index.row()]Install with Tessl CLI
npx tessl i tessl/pypi-pyqt-fluent-widgets