PyQt4 - การใช้สไตล์ชีทบนวัตถุที่สืบทอดมาจาก QWidget

ฉันมีปัญหากับ PyQt4 ฉันมีคลาสที่สืบทอดมาจาก QWidget คลาสนี้ใช้โครงร่างเพื่อจัดเก็บ QLabel และ QLineEdit นี่คือรหัส:

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)

และนี่คือสไตล์ชีต:

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

ตอนนี้ ปัญหาของฉันคือสไตล์ชีทใช้ไม่ได้ตามที่ฉันต้องการ ใช้กับ QLabel ของฉันเฉพาะเมื่อเส้นขอบควรอยู่รอบวัตถุทั้งหมด:

ป้อนคำอธิบายรูปภาพที่นี่

เมื่อฉันมีฟังก์ชันที่สร้างแถบค้นหาเป็น QWidget มันทำงานได้อย่างสมบูรณ์แบบ แต่ตอนนี้ฉันเปลี่ยนเป็นคลาสแล้ว มันใช้งานไม่ได้ ผมทำอะไรผิดหรือเปล่า?

แก้ไข: ฉันกำลังพยายามทำสิ่งนี้ให้สำเร็จ:

ป้อนคำอธิบายรูปภาพที่นี่

แก้ไข 2: รหัสก่อนหน้าก่อนที่ฉันจะเปลี่ยนเป็นคลาสคือ:

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 แหล่งที่มา
comment
SearchBoxคืออะไร?   -  person eyllanesc    schedule 04.09.2017
comment
เมื่อคุณพูดว่า: เปลี่ยนสิ่งนั้นเป็นคลาส คุณหมายถึงอะไร   -  person eyllanesc    schedule 04.09.2017
comment
@eyllanesc SearchBox เป็นคลาสที่สืบทอด QLineEdit และมีฟังก์ชันแทนที่บางอย่างเพื่อให้เหมาะกับความต้องการของฉัน ฉันทิ้งมันไปเพราะฉันไม่คิดว่ามันเกี่ยวข้องกับปัญหาของฉัน   -  person Alex Kasapis    schedule 04.09.2017
comment
@eyllanesc ฉันเคยเรียกใช้ฟังก์ชันที่ส่งคืน QWidget ซึ่งโดยพื้นฐานแล้วเป็นคอนเทนเนอร์สำหรับ SearchBar ของฉัน ฉันใช้สไตล์ชีตกับคอนเทนเนอร์นี้ - เช่นเดียวกับที่ฉันใช้สไตล์ชีตกับตัวเอง - และมันก็ใช้ได้ดี   -  person Alex Kasapis    schedule 04.09.2017
comment
ฉันไม่เข้าใจคำถามเฉพาะของคุณ โปรดอธิบายให้ชัดเจนยิ่งขึ้น สิ่งที่คุณได้รับ และสิ่งที่คุณต้องการได้รับ   -  person eyllanesc    schedule 04.09.2017
comment
@eyllanesc ขออภัยสำหรับความสับสน ฉันต้องการผลลัพธ์ก่อนหน้านี้ ซึ่งก็คือ: ลิงก์ อย่างที่คุณเห็น เส้นขอบครอบคลุม QWidget ทั้งหมด   -  person Alex Kasapis    schedule 04.09.2017
comment
คุณสามารถยกตัวอย่างโค้ดที่เหมาะกับคุณได้เพียงเล็กน้อย และโค้ดใดที่จะทำให้คุณล้มเหลว หาก SearchBox ไม่เกี่ยวข้อง ให้เปลี่ยนเป็น QLineEdit   -  person eyllanesc    schedule 04.09.2017
comment
@eyllanesc ฉันเพิ่งแก้ไขในโค้ดเก่าที่เคยใช้งานได้   -  person Alex Kasapis    schedule 04.09.2017
comment
โปรดเปลี่ยน SearchBox โดย QLineEdit เพื่อหลีกเลี่ยงความสับสน :ป   -  person eyllanesc    schedule 04.09.2017
comment
@eyllanesc เพิ่งทำ   -  person Alex Kasapis    schedule 04.09.2017
comment
ด้วยรหัสก่อนหน้าหรือรหัสใหม่ ฉันได้สิ่งที่คุณต้องการ บางทีฉันอาจใช้รหัสของคุณผิด ดังนั้นฉันจึงไม่มีปัญหานั้น คุณสามารถแชร์รหัสของคุณจากทั้งสองกรณีผ่าน GitHub, ไดรฟ์, ดรอปบ็อกซ์ หรือที่คล้ายกัน และด้วยเหตุนี้ สามารถทดสอบปัญหาได้อย่างเต็มที่   -  person eyllanesc    schedule 04.09.2017
comment
ฉันจะลองอีกครั้งเพื่อดูว่าได้ผลหรือไม่ ขอบคุณสำหรับความช่วยเหลือของคุณ!   -  person Alex Kasapis    schedule 04.09.2017
comment
แน่นอนคุณได้พบข้อผิดพลาดของคุณแล้ว :ป   -  person eyllanesc    schedule 04.09.2017


คำตอบ (1)


เปลี่ยนคลาสพื้นฐานของ SearchBar จาก QWidget เป็น QFrame หรือใช้ style sheet Aware PaintEvent:

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

จากนั้นจึงเปลี่ยนสไตล์ชีตเป็น

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