Изменение заднего фона открывающегося меню qcombobox, drop-arrow и scrollbar

Есть код, в котором есть qcombobox. Мне нужно добавить туда стрелочку и когда comobox закрыт - она должна смотреть направо, а когда combobx открывается то она должна поворачиваться на 90 градусов вниз.

Так же есть проблема с выпадающим меню. Задний фон должен быть белым, но он градиентный.

Так-же можно ли изменить скроллбар, например цвет оранжевый и закруглёные углы.

import sys
from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(472, 426)
MainWindow.setStyleSheet("background-color: qlineargradient(spread:pad, x1:0.011, y1:1, x2:1, y2:0, stop:0 rgba(182, 29, 212, 255), stop:1 rgba(48, 7, 182, 255));\n"
"")
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.comboBox_2 = QtWidgets.QComboBox(self.centralwidget)
self.comboBox_2.setGeometry(QtCore.QRect(90, 80, 271, 41))
palette = QtGui.QPalette()
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Button, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Window, brush)
brush = QtGui.QBrush(QtGui.QColor(183, 178, 188))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Highlight, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Button, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Base, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Window, brush)
brush = QtGui.QBrush(QtGui.QColor(183, 178, 188))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Highlight, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Button, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Base, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Window, brush)
brush = QtGui.QBrush(QtGui.QColor(183, 178, 188))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Highlight, brush)
self.comboBox_2.setPalette(palette)
font = QtGui.QFont()
font.setFamily("Arial")
font.setPointSize(13)
font.setBold(True)
font.setWeight(75)
self.comboBox_2.setFont(font)
self.comboBox_2.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
self.comboBox_2.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.comboBox_2.setAutoFillBackground(False)
self.comboBox_2.setStyleSheet("border-top-left-radius: 7;\n"
"border-top-right-radius: 7;\n"
"background-color: rgb(255, 255, 255);\n"
"\n"
"\n"
"\n"
"}\n"
"\n"
"QComboBox::drop-down {\n"
" background-color: transparent;\n"
"\n"
"}\n"
"\n"
"QComboBox:hover {\n"
" background-color: rgba(188, 188, 188, 240);\n"
"\n"
" \n"
"\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"")
self.comboBox_2.setEditable(False)
self.comboBox_2.setMaxVisibleItems(11)
self.comboBox_2.setIconSize(QtCore.QSize(45, 45))
self.comboBox_2.setFrame(False)
self.comboBox_2.setObjectName("comboBox_2")
self.comboBox_2.addItem("")
self.comboBox_2.addItem("")
self.comboBox_2.addItem("")

self.comboBox_2.addItem("")
self.comboBox_2.addItem("")
self.comboBox_2.addItem("")
self.comboBox_2.addItem("")
self.comboBox_2.addItem("")
self.comboBox_2.addItem("")
self.comboBox_2.addItem("")
self.comboBox_2.addItem("")
self.comboBox_2.addItem("")
self.comboBox_2.addItem("")
self.comboBox_2.addItem("")
self.comboBox_2.addItem("")
self.comboBox_2.addItem("")
self.comboBox_2.addItem("")
self.comboBox_2.addItem("")
self.comboBox_2.addItem("")
self.comboBox_2.addItem("")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(0, 30, 471, 41))
font = QtGui.QFont()
font.setFamily("Arial")
font.setPointSize(20)
font.setStyleStrategy(QtGui.QFont.PreferAntialias)
self.label.setFont(font)
self.label.setStyleSheet("color: rgb(255, 255, 255);\n"
"background-color: transparent;")
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setObjectName("label")
MainWindow.setCentralWidget(self.centralwidget)

self.retranslateUi(MainWindow)
self.comboBox_2.setCurrentIndex(0)
QtCore.QMetaObject.connectSlotsByName(MainWindow)

def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.comboBox_2.setCurrentText(_translate("MainWindow", "1"))
self.comboBox_2.setItemText(0, _translate("MainWindow", "1"))
self.comboBox_2.setItemText(1, _translate("MainWindow", "2"))
self.comboBox_2.setItemText(2, _translate("MainWindow", "3"))
self.comboBox_2.setItemText(3, _translate("MainWindow", "4"))
self.comboBox_2.setItemText(4, _translate("MainWindow", "5"))
self.comboBox_2.setItemText(5, _translate("MainWindow", "6"))
self.comboBox_2.setItemText(6, _translate("MainWindow", "7"))
self.comboBox_2.setItemText(7, _translate("MainWindow", "8"))
self.comboBox_2.setItemText(8, _translate("MainWindow", "9"))
self.comboBox_2.setItemText(9, _translate("MainWindow", "10"))
self.comboBox_2.setItemText(10, _translate("MainWindow", "11"))
self.comboBox_2.setItemText(11, _translate("MainWindow", "12"))
self.comboBox_2.setItemText(12, _translate("MainWindow", "13"))
self.comboBox_2.setItemText(13, _translate("MainWindow", "14"))
self.comboBox_2.setItemText(14, _translate("MainWindow", "15"))
self.comboBox_2.setItemText(15, _translate("MainWindow", "16"))
self.comboBox_2.setItemText(16, _translate("MainWindow", "17"))
self.comboBox_2.setItemText(17, _translate("MainWindow", "18"))
self.comboBox_2.setItemText(18, _translate("MainWindow", "19"))
self.comboBox_2.setItemText(19, _translate("MainWindow", "20"))
self.label.setText(_translate("MainWindow", "Самый обычный Combo Box"))

class ExampleApp(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()

self.setupUi(self)

if __name__=="__main__":
app = QtWidgets.QApplication(sys.argv)
window = ExampleApp()
window.show()
sys.exit(app.exec_())

Ответы (1 шт):

Автор решения: S. Nick

Мне почему-то кажется, что то, что вы хотите, лучше делать не в Qt Designere.

Вот вам Примеры таблиц стилей Qt https://doc.qt.io/archives/qt-4.8/stylesheet-examples.html

и пример, на котором вы можете потренироваться.

from PyQt5 import QtCore, QtWidgets

class Widget(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()

        combo = QtWidgets.QComboBox()
        self.list = QtWidgets.QListView(combo)
        combo.addItems(["item1", "item2", "item3", "item4", "item5", "item6",
                        "item7", "item8", "item9", "item10", "item11", "item12",])
        combo.setView(self.list)
        combo.activated[str].connect(self.onActivatedText)
        combo.setMinimumWidth(200)

        label = QtWidgets.QLabel("Самый обычный Combo Box")

        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(label)
        layout.addWidget(combo)

    @QtCore.pyqtSlot(str)
    def onActivatedText(self, text):
        print(text)


CSS = '''

QWidget {
    background-color: #18465d;
}
QComboBox {
    font: 12pt Fira Sans Condensed;
    background-color: #2e2e2e;
    border-top: 0px solid #3e3e3e;
    border-left: 0px solid #3e3e3e;
    border-right: 0px solid #3e3e3e;
    border-bottom: 2px solid #3e3e3e;
    padding: 5%;
    max-height: 30px;
    min-width: 140px;
    color: white;
    selection-background-color: #5e5e5e;
    border-radius: 7px;                 /* закруглёные углы */
}
QComboBox::hover {
    background-color: #5e5e5e;
}
QComboBox::drop-down {
    border: none;
}
QComboBox::down-arrow {
    /*                         поставьте свои картинки */
    image: url(D:/_Qt/img/stylesheet-branch-closed.png);
    width: 25px;
    height: 25px;
    border-width: 0px;
    padding-right: 10px;
}

QComboBox::down-arrow:pressed {
    /*                      поставьте свои картинки */
    image: url(D:/_Qt/img/stylesheet-branch-open.png);
    background-color: #fff;
}
QListView {
    font: 12pt Fira Sans Condensed;
    background-color: #2e2e2e;
    outline: 0;
    color: white;
    selection-background-color: #5e5e5e;
}
QListView::item {
    min-height: 20px;
    padding: 5%;
}
QLabel {
    color: rgb(255, 255, 255);
    font: 15pt Fira Sans Condensed;
}

'''

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)

    app.setStyleSheet(CSS) 

    w = Widget()
    w.show()
    sys.exit(app.exec_())

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


А как сделать так чтоб при нажатии на сам combobox менялясь стрелка, а не при нажатии на саму стрелку?

Обратите внимания на новую строку в app.setStyleSheet(StyleSheet)

from PyQt5 import QtCore, QtWidgets

class Widget(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()

        combo = QtWidgets.QComboBox()
        self.list = QtWidgets.QListView(combo)
        combo.addItems(["item1", "item2", "item3", "item4", "item5", "item6",
                        "item7", "item8", "item9", "item10", "item11", "item12",])
        combo.setView(self.list)
        combo.activated[str].connect(self.onActivatedText)
        combo.setMinimumWidth(200)

        label = QtWidgets.QLabel("Самый обычный Combo Box")

        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(label)
        layout.addWidget(combo)

    @QtCore.pyqtSlot(str)
    def onActivatedText(self, text):
        print(text)


CSS = '''

QWidget {
    background-color: #18465d;
}
QComboBox {
    font: 12pt Fira Sans Condensed;
    background-color: #2e2e2e;
    border-top: 0px solid #3e3e3e;
    border-left: 0px solid #3e3e3e;
    border-right: 0px solid #3e3e3e;
    border-bottom: 2px solid #3e3e3e;
    padding: 5%;
    max-height: 30px;
    min-width: 140px;
    color: white;
    selection-background-color: #5e5e5e;
    border-radius: 7px;                 /* закруглёные углы */
}
QComboBox::hover {
    background-color: #5e5e5e;
}
QComboBox::drop-down {
    border: none;
}
QComboBox::down-arrow {
    /*                         поставьте свои картинки */
    image: url(D:/_Qt/img/stylesheet-branch-closed.png);
    width: 25px;
    height: 25px;
    border-width: 0px;
    padding-right: 10px;
}

QComboBox::down-arrow:pressed {
    /*                      поставьте свои картинки */
    image: url(D:/_Qt/img/stylesheet-branch-open.png);
    background-color: #fff;
}
QListView {
    font: 12pt Fira Sans Condensed;
    background-color: #2e2e2e;
    outline: 0;
    color: white;
    selection-background-color: #5e5e5e;
}
QListView::item {
    min-height: 20px;
    padding: 5%;
}
QLabel {
    color: rgb(255, 255, 255);
    font: 15pt Fira Sans Condensed;
}
'''

StyleSheet = '''
QComboBox {
    border: 2px solid gray;
    border-radius: 3px;
    padding: 1px 18px 1px 3px;
    min-width: 6em;
}
QComboBox:editable {
    background: white;    
}
QComboBox:!editable, QComboBox::drop-down:editable {
     background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
                                 stop: 0 #E1E1E1, stop: 0.4 #DDDDDD,
                                 stop: 0.5 #D8D8D8, stop: 1.0 #D3D3D3);
}
/* QComboBox получает состояние `on`, когда всплывающее окно открыто  */
QComboBox:!editable:on, QComboBox::drop-down:editable:on {
    background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
                                stop: 0 #D3D3D3, stop: 0.4 #D8D8D8,
                                stop: 0.5 #DDDDDD, stop: 1.0 #E1E1E1);
}
QComboBox:on { /* сдвиньте текст, когда всплывающее окно откроется */
    padding-top: 3px;
    padding-left: 4px;
}
QComboBox::drop-down {
    subcontrol-origin: padding;
    subcontrol-position: top right;
    width: 15px;
    border-left-width: 1px;
    border-left-color: darkgray;
    border-left-style: solid;          
    border-top-right-radius: 3px;      
    border-bottom-right-radius: 3px;
}

QComboBox::down-arrow {
    image: url(D:/_Qt/img/stylesheet-branch-closed.png);            /* <<=====< */
}
QComboBox::down-arrow:on { 
    top: 1px;
    left: 1px;
    image: url(D:/_Qt/img/stylesheet-branch-open.png);              /* <<=====< */
}

QComboBox QAbstractItemView {
    border: 2px solid darkgray;
    selection-background-color: lightgray;
}
QComboBox QListView {
    color: palette(shadow);
    border: none; /*5px solid red;
    selection-background-color: lightgray;*/
}

/* ===================== QScrollBar ======================= */
QScrollBar:vertical
 {
     background-color: #2A2929;
     width: 15px;
     margin: 15px 3px 15px 3px;
     border: 1px transparent #2A2929;
     border-radius: 4px;
 }

 QScrollBar::handle:vertical
 {
     background-color: red;         
     min-height: 5px;
     border-radius: 4px;
 }

 QScrollBar::sub-line:vertical
 {
     margin: 3px 0px 3px 0px;
     border-image: url(./images/up_arrow_disabled.png);        
     height: 10px;
     width: 10px;
     subcontrol-position: top;
     subcontrol-origin: margin;
 }

 QScrollBar::add-line:vertical
 {
     margin: 3px 0px 3px 0px;
     border-image: url(./images/down_arrow_disabled.png);       
     height: 10px;
     width: 10px;
     subcontrol-position: bottom;
     subcontrol-origin: margin;
 }

 QScrollBar::sub-line:vertical:hover,QScrollBar::sub-line:vertical:on
 {

     border-image: url(./images/up_arrow.png);                 
     height: 10px;
     width: 10px;
     subcontrol-position: top;
     subcontrol-origin: margin;
 }


 QScrollBar::add-line:vertical:hover, QScrollBar::add-line:vertical:on
 {
     border-image: url(./images/down_arrow.png);                
     height: 10px;
     width: 10px;
     subcontrol-position: bottom;
     subcontrol-origin: margin;
 }

 QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical
 {
     background: none;
 }


 QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical
 {
     background: none;
 }
'''


if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)

    app.setStyleSheet(StyleSheet)                                      # (CSS) 

    w = Widget()
    w.show()
    sys.exit(app.exec_())

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

→ Ссылка