PyQt4 - Menerapkan stylesheet pada objek yang diwarisi dari QWidget

Saya mengalami masalah dengan PyQt4. Saya memiliki kelas yang mewarisi dari QWidget. Kelas ini menggunakan tata letak untuk menyimpan QLabel dan QLineEdit. Ini kodenya:

class SearchBar(QtGui.QWidget):
    def __init__(self, parent=None):
        super(SearchBar, self).__init__(parent)
        self.setStyleSheet(SEARCHBAR_STYLE)

        layout = QtGui.QHBoxLayout()
        layout.setSpacing(0)
        layout.setMargin(0)
        layout.addStrut(SEARCHAR_HEIGHT)

        lbl_notification = QtGui.QLabel('Hi')
        lbl_notification.setStyleSheet(SEARCHBAR_NOTIFICATION_STYLE)
        layout.addSpacing(10)
        layout.addWidget(lbl_notification)

        searchbox = QLineEdit('Search')
        layout.addStretch()
        layout.addWidget(searchbox)
        layout.addSpacing(10)

        self.setLayout(layout)

dan inilah stylesheetnya:

SEARCHBAR_STYLE = """
                  QWidget {
                      background: #424a7d;
                  }
                  .QWidget {
                      border: 1px solid grey;
                  }
                  QLabel {
                      border-top: 1px solid grey;
                      border-bottom: 1px solid grey;
                  }
                  """

Sekarang, masalah saya adalah stylesheet tidak berlaku seperti yang saya inginkan. Ini hanya berlaku di QLabel saya ketika batasnya harus mengelilingi seluruh objek:

masukkan deskripsi gambar di sini

Ketika saya memiliki fungsi yang membuat bilah pencarian sebagai QWidget, itu berfungsi dengan sempurna, tetapi sekarang saya mengubahnya menjadi kelas, fungsi itu tidak berfungsi. Apa yang saya lakukan salah?

EDIT: Saya mencoba mencapai ini:

masukkan deskripsi gambar di sini

EDIT 2: Kode sebelumnya, sebelum saya mengubahnya menjadi kelas, adalah ini:

def create_bar():
    layout = QtGui.QHBoxLayout()
    layout.setSpacing(0)
    layout.setMargin(0)
    layout.addStrut(SEARCHAR_HEIGHT)

    lbl_notification = QtGui.QLabel('Hi')
    lbl_notification.setStyleSheet(SEARCHBAR_NOTIFICATION_STYLE)
    layout.addSpacing(10)
    layout.addWidget(lbl_notification)

    search_bar = QtGui.QLineEdit('Search')
    search_bar.setMinimumSize(200, 25)
    search_bar.setMaximumSize(200, 25)
    search_bar.setStyleSheet(SEARCHBOX_STYLE)

    layout.addStretch()
    layout.addWidget(search_bar)
    layout.addSpacing(10)

    widget = QtGui.QWidget()
    widget.setStyleSheet(SEARCHBAR_STYLE)
    widget.setLayout(layout)
    return widget

person Alex Kasapis    schedule 04.09.2017    source sumber
comment
apa itu SearchBox?   -  person eyllanesc    schedule 04.09.2017
comment
Saat Anda mengatakan hal berikut: mengubahnya menjadi kelas, apa maksud Anda?   -  person eyllanesc    schedule 04.09.2017
comment
@eyllanesc SearchBox adalah kelas yang mewarisi QLineEdit dan memiliki beberapa fungsi override untuk memenuhi kebutuhan saya. Saya mengabaikannya karena menurut saya itu tidak relevan dengan masalah saya   -  person Alex Kasapis    schedule 04.09.2017
comment
@eyllanesc Saya biasa memanggil fungsi yang mengembalikan QWidget, yang pada dasarnya merupakan wadah untuk SearchBar saya. Saya menerapkan stylesheet saya ke wadah ini - seperti sekarang saya menerapkan stylesheet ke diri sendiri - dan itu berfungsi dengan baik.   -  person Alex Kasapis    schedule 04.09.2017
comment
Saya tidak mengerti pertanyaan spesifik Anda, jelaskan lebih baik, apa yang Anda dapatkan, dan apa yang ingin Anda dapatkan.   -  person eyllanesc    schedule 04.09.2017
comment
@eyllanesc Maaf atas kebingungannya, saya ingin hasil sebelumnya, yaitu ini: link. Seperti yang Anda lihat, perbatasan mencakup seluruh QWidget   -  person Alex Kasapis    schedule 04.09.2017
comment
Anda dapat memberikan contoh minimal kode yang sesuai untuk Anda dan kode mana yang akan mengecewakan Anda, jika SearchBox tidak relevan, ubah ke QLineEdit.   -  person eyllanesc    schedule 04.09.2017
comment
@eyllanesc Saya baru saja mengedit kode lama yang dulu berfungsi   -  person Alex Kasapis    schedule 04.09.2017
comment
Silakan ubah SearchBox oleh QLineEdit untuk menghindari kebingungan. :P   -  person eyllanesc    schedule 04.09.2017
comment
@eyllanesc baru saja melakukannya   -  person Alex Kasapis    schedule 04.09.2017
comment
Dengan kode Anda sebelumnya atau yang baru, saya mendapatkan apa yang Anda inginkan, mungkin saya salah mengimplementasikan kode Anda, jadi saya tidak punya masalah itu, Anda dapat membagikan kode Anda dari kedua kasus melalui github, drive, dropbox atau sejenisnya dan dengan demikian menjadi dapat menguji permasalahan secara menyeluruh.   -  person eyllanesc    schedule 04.09.2017
comment
Saya akan mencobanya lagi dan melihat apakah berhasil. Terima kasih atas bantuan Anda!   -  person Alex Kasapis    schedule 04.09.2017
comment
Pasti Anda sudah menemukan kesalahan Anda. :P   -  person eyllanesc    schedule 04.09.2017


Jawaban (1)


Ubah kelas dasar SearchBar dari QWidget menjadi QFrame, atau sebagai alternatif, terapkan paintEvent yang peka terhadap style sheet:

def paintEvent(self, event):
    opt = QStyleOption()
    opt.initFrom(self)
    painter = QPainter(self)
    self.style().drawPrimitive(QStyle.PE_Widget, opt, painter, self)

Kemudian ubah style sheetnya menjadi

SEARCHBAR_STYLE = """
SearchBar {
    background: #424a7d;
    border: 1px solid grey;
}
"""
person Aleš Erjavec    schedule 05.09.2017