|
12 | 12 | # from PyQt5.QtGui import QPainter, QPen, QBrush, QColor, QFont, QImage, QPainterPath |
13 | 13 | from PyQt5.QtGui import QBrush, QColor |
14 | 14 | from PyQt5.QtGui import QPixmap |
15 | | -import configparser |
16 | | -from PyQt5.QtCore import pyqtSignal |
17 | | -from PyQt5.QtCore import QEvent |
| 15 | +from PyQt5.QtCore import pyqtSignal |
| 16 | +from PyQt5.QtWidgets import QVBoxLayout, QCompleter, QLineEdit |
| 17 | +from PyQt5.QtCore import QStringListModel, QSortFilterProxyModel, QRegExp |
18 | 18 | # ui相关的小组件,非窗口 |
19 | 19 |
|
20 | 20 | class RoundQDialog(QDialog): |
@@ -239,29 +239,57 @@ def mouseReleaseEvent(self, e): |
239 | 239 | class ScoreTable(QtWidgets.QTableWidget): |
240 | 240 | ... |
241 | 241 |
|
242 | | -# 可编辑、阻止输入框部分点击事件冒泡 |
243 | | -class BetterQCombox(QComboBox): |
244 | | - resize = pyqtSignal() |
245 | | - def __init__(self, parent=None): |
246 | | - super(BetterQCombox, self).__init__(parent) |
247 | | - |
248 | | - def mousePressEvent(self, event): |
249 | | - # 拦截鼠标按下事件,阻止事件冒泡 |
250 | | - super().mousePressEvent(event) |
251 | | - event.accept() |
252 | | - |
253 | | - def mouseReleaseEvent(self, event): |
254 | | - # 拦截鼠标释放事件,阻止事件冒泡 |
255 | | - super().mouseReleaseEvent(event) |
256 | | - event.accept() |
257 | | - |
258 | | - def resizeEvent(self, e): |
259 | | - self.resize.emit() |
260 | | - |
261 | | - |
262 | | - |
263 | | - |
264 | 242 |
|
| 243 | +class CountryComboBox(QComboBox): |
| 244 | + def __init__(self, countries, parent=None): |
| 245 | + super().__init__(parent) |
| 246 | + |
| 247 | + # 1. 基础设置 |
| 248 | + self.setEditable(True) |
| 249 | + self.lineEdit().setAlignment(Qt.AlignCenter) |
| 250 | + self.setInsertPolicy(QComboBox.NoInsert) |
| 251 | + self.view().setTextElideMode(Qt.ElideNone) |
| 252 | + self.view().setSpacing(2) |
| 253 | + self.view().setLayoutDirection(Qt.LeftToRight) |
| 254 | + |
| 255 | + # 2. 设置 model |
| 256 | + self._model = QStringListModel(countries) |
| 257 | + self._proxy_model = QSortFilterProxyModel(self) |
| 258 | + self._proxy_model.setSourceModel(self._model) |
| 259 | + self._proxy_model.setFilterCaseSensitivity(Qt.CaseInsensitive) |
| 260 | + self._proxy_model.setFilterKeyColumn(0) |
| 261 | + |
| 262 | + self.setModel(self._model) |
| 263 | + |
| 264 | + # 3. 设置补全器 |
| 265 | + self._completer = QCompleter(self._proxy_model, self) |
| 266 | + self._completer.setCompletionMode(QCompleter.PopupCompletion) |
| 267 | + self._completer.setFilterMode(Qt.MatchContains) # 包含搜索 |
| 268 | + self._completer.popup().setTextElideMode(Qt.ElideNone) |
| 269 | + self._completer.popup().setLayoutDirection(Qt.LeftToRight) |
| 270 | + self._completer.popup().setStyleSheet("QListView { text-align: center; color: #3d3d3d; font: 12pt '微软雅黑';}") |
| 271 | + self.setCompleter(self._completer) |
| 272 | + |
| 273 | + # 4. 居中补全框中的文字 |
| 274 | + self._completer.popup().setUniformItemSizes(True) |
| 275 | + self._completer.popup().setWordWrap(False) |
| 276 | + |
| 277 | + # 5. 信号绑定:输入时过滤 |
| 278 | + self.lineEdit().textEdited.connect(self._on_text_edited) |
| 279 | + |
| 280 | + # 6. 居中下拉框中的文字 |
| 281 | + self.setStyleSheet(""" |
| 282 | + QComboBox QAbstractItemView { |
| 283 | + text-align: center; |
| 284 | + } |
| 285 | + QComboBox { |
| 286 | + qproperty-alignment: 'AlignCenter'; |
| 287 | + } |
| 288 | + """) |
| 289 | + |
| 290 | + def _on_text_edited(self, text): |
| 291 | + self._proxy_model.setFilterFixedString(text) |
| 292 | + self._completer.complete() # 打开补全框 |
265 | 293 |
|
266 | 294 |
|
267 | 295 |
|
0 commit comments