Как изменить курсор между виджетами QSplitter?

Рейтинг: 1Ответов: 1Опубликовано: 30.07.2023

Мне очень подошёл способ объединение виджетов, через QSplitter, т.к. в нём я могу настроить расстояние между виджетами.

Я чуть позже объединяю QLayout и QSplitter. Так вот, пространство между виджетами (QPushButton) имеет определённый курсор.

На скрине курсор не сохраняется, мне хотелось бы его изменить.
Позже добавлю для кнопок изображения.

Если есть замечания по коду, пожалуйста расскажите. Заранее благодарен за помощь.

введите сюда описание изображения

import sys
from PySide6.QtWidgets import (QMainWindow, QApplication, QPushButton, QWidget, QMessageBox, QDialog,
    QLineEdit, QVBoxLayout, QHBoxLayout, QSplitter, QListWidget, QListWidgetItem, QSizePolicy)
from PySide6.QtCore import (Qt)

class change_word(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setStyleSheet(u'background-color: rgb(56, 56 ,56)')

        self.central_widget = QWidget(self)
        self.setCentralWidget(self.central_widget)

        self.VLayout_buttons = QSplitter()
        self.VLayout_buttons.setOrientation(Qt.Vertical)
        self.VLayout_buttons.setOpaqueResize(True)
        self.VLayout_buttons.setHandleWidth(20)
        self.VLayout_buttons.setChildrenCollapsible(True)

        self.VLayout_word = QVBoxLayout()
        self.HLayout_all = QHBoxLayout(self.central_widget)

        self.sizePolicy_button = QSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum)
        self.button_change = QPushButton()
        self.button_change.setMinimumSize(40, 40)
        self.button_change.setSizePolicy(self.sizePolicy_button)

        self.button_delete = QPushButton()
        self.button_delete.setMinimumSize(40, 40)
        self.button_delete.setSizePolicy(self.sizePolicy_button)

        self.VLayout_buttons.addWidget(self.button_change)
        self.VLayout_buttons.addWidget(self.button_delete)

        self.Filter_line = QLineEdit(self.central_widget)
        self.Filter_line.setStyleSheet(
            'color: white;'
            'background: rgb(80, 80, 80);'
            'border: 2px solid rgb(90, 90, 90);'
            'border-radius: 3px'
        )
        self.Filter_line.textChanged.connect(lambda: self.search_func(self.Filter_line.text()))

        self.List_Word = QListWidget(self.central_widget)
        self.List_Word.setStyleSheet(
            'QListWidget {'
            'background: rgb(80, 80, 80);'
            'color: White;'
            'font-size: 14px'
            '}'
            'QListWidget::item:hover {'
            'background: rgba(255, 255, 255, 40)'
            '}'
            'QListWidget::item:selected {'
            'background: rgba(255, 255, 255, 70)'
            '}'
        )
        self.List_Word.itemDoubleClicked.connect(self.Double_clicked_item)
        Words = ['Crash', 'Smash', 'Trouble', 'Error', 'Smile']
        self.List_Word.addItems(Words)

        self.VLayout_word.addWidget(self.Filter_line)
        self.VLayout_word.addWidget(self.List_Word)

        self.HLayout_all.addLayout(self.VLayout_word)
        self.HLayout_all.addWidget(self.VLayout_buttons)


    def search_func(self, sort_filter):
        for index in range(self.List_Word.count()):
            item = self.List_Word.item(index)
            if sort_filter.lower() in item.text().lower():
                item.setHidden(False)
            else:
                item.setHidden(True)

    def Double_clicked_item(self, item: QListWidgetItem):
        print(item.text())

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main_win = change_word()
    size = main_win.screen().availableSize()
    main_win.resize(size.width()/4, size.height()/2)
    main_win.show()
    sys.exit(app.exec())

Ответы

▲ 1Принят

QSplitterHandle *QSplitter::handle(int index) const

Возвращает дескриптор слева (или выше) элемента в макете разделителя по заданному индексу или nullptr, если такого элемента нет.
Дескриптор с индексом 0 всегда скрыт.


Некоторые несвязанные, но все же важные предложения:

  1. имена классов и констант всегда должны быть написаны с заглавной буквы, а функции и переменные всегда должны начинаться со строчной буквы;
  2. всегда должна быть пустая строка между функциями и две для разделения классов;
  3. всегда ставьте пробелы вокруг символа равенства, используемого для присваивания;
  4. ...

Не стоит недооценивать все эти аспекты, так как они очень важны для удобочитаемости (что очень важно). Вы можете прочитать больше в официальном Руководстве по стилю для кода Python.


import sys
'''
from PySide6.QtWidgets import (QMainWindow, QApplication, QPushButton, 
    QWidget, QMessageBox, QDialog, QLineEdit, QVBoxLayout, QHBoxLayout, 
    QSplitter, QListWidget, QListWidgetItem, QSizePolicy)
from PySide6.QtCore import (Qt)
'''
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *

# --> v.....v... <-----------------------------------------------------
class ChangeWord(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setStyleSheet(u'background-color: rgb(56, 56 ,56)')

        self.central_widget = QWidget(self)
        self.setCentralWidget(self.central_widget)
# ----------> vvvvvvvv <--------------------------------------------------
#        self.splitter = QSplitter()
        self.VLayout_buttons = QSplitter()
        self.VLayout_buttons.setOrientation(Qt.Vertical)
        self.VLayout_buttons.setOpaqueResize(True)
        self.VLayout_buttons.setHandleWidth(20)                       # ? 20
        self.VLayout_buttons.setChildrenCollapsible(True)

# ----------> VvV.......... <--------------------------------------------------
#        self.v_layout_word = QVBoxLayout()        
        self.VLayout_word = QVBoxLayout()
        self.HLayout_all = QHBoxLayout(self.central_widget)

        self.sizePolicy_button = QSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum)
        self.button_change = QPushButton()
        self.button_change.setMinimumSize(40, 40)
        self.button_change.setSizePolicy(self.sizePolicy_button)

        self.button_delete = QPushButton()
        self.button_delete.setMinimumSize(40, 40)
        self.button_delete.setSizePolicy(self.sizePolicy_button)

        self.VLayout_buttons.addWidget(self.button_change)
        self.VLayout_buttons.addWidget(self.button_delete)

        self.Filter_line = QLineEdit(self.central_widget)
        self.Filter_line.setStyleSheet(
            'color: white;'
            'background: rgb(80, 80, 80);'
            'border: 2px solid rgb(90, 90, 90);'
            'border-radius: 3px'
        )
        self.Filter_line.textChanged.connect(self.search_func)
# ???            lambda: self.search_func(self.Filter_line.text()))

        self.List_Word = QListWidget(self.central_widget)
        self.List_Word.setStyleSheet(
            'QListWidget {'
            'background: rgb(80, 80, 80);'
            'color: White;'
            'font-size: 14px'
            '}'
            'QListWidget::item:hover {'
            'background: rgba(255, 255, 255, 40)'
            '}'
            'QListWidget::item:selected {'
            'background: rgba(255, 255, 255, 70)'
            '}'
        )
        self.List_Word.itemDoubleClicked.connect(self.Double_clicked_item)
        Words = ['Crash', 'Smash', 'Trouble', 'Error', 'Smile']
        self.List_Word.addItems(Words)

        self.VLayout_word.addWidget(self.Filter_line)
        self.VLayout_word.addWidget(self.List_Word)

        self.HLayout_all.addLayout(self.VLayout_word)
        self.HLayout_all.addWidget(self.VLayout_buttons)
        
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
        pixmap = QtGui.QPixmap('_+_.png').scaled(80, 80) 
        cursor = QtGui.QCursor(pixmap)        
        self.handle = self.VLayout_buttons.handle(1)
        self.handle.setCursor(cursor)         
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    def search_func(self, sort_filter):
        for index in range(self.List_Word.count()):
            item = self.List_Word.item(index)
            if sort_filter.lower() in item.text().lower():
                item.setHidden(False)
            else:
                item.setHidden(True)

    def Double_clicked_item(self, item: QListWidgetItem):
        print(item.text())
         
        
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv        
QSS = """
QSplitter::handle {
    background: #DAA520;
}
QSplitter::handle:pressed {
    background: #FFD700;
}
"""
        

if __name__ == '__main__':
    app = QApplication(sys.argv)
    
    app.setStyleSheet(QSS)                                            # +++
    
    main_win = ChangeWord()
    size = main_win.screen().availableSize()
    main_win.resize(size.width()/4, size.height()/2)
    main_win.show()
    sys.exit(app.exec())

введите сюда описание изображения

введите сюда описание изображения


_+_.png

введите сюда описание изображения