2013-08-20 13 views
11

Trường hợp 1: Tạo phân lớp của QWidget với Q_OBJECT và đặt biểu định kiểu - không có hiệu lực.Tại sao biểu định kiểu không hoạt động khi phân lớp QWidget và sử dụng Q_OBJECT?

Trường hợp 2: Tạo lớp con của QWidget mà không Q_OBJECT và thiết lập stylesheet - công trình như mong đợi

Trường hợp 3: Tạo lớp con của QLabel với Q_OBJECT và thiết lập stylesheet - làm việc như mong đợi

Làm thế nào để hiểu được điều này hành vi? Có thể tạo bảng định kiểu trong trường hợp 1 không?

+0

hãy viết một số cách để hiểu hành vi này - bạn có điều gì đó sai trong mã của mình. Trường hợp 1 hoạt động tốt mà không cần bất kỳ giải pháp 'kỹ thuật đặc biệt' nào – evilruff

Trả lời

20

Nếu bạn muốn lớp con QWidget tùy chỉnh để hỗ trợ stylesheets, bạn cần cung cấp đoạn mã sau: Qt Code:

void myclass::paintEvent(QPaintEvent *pe) 
{                                   
    QStyleOption o;                                         
    o.initFrom(this);                                         
    QPainter p(this);                                         
    style()->drawPrimitive(
    QStyle::PE_Widget, &o, &p, this);                               
}; 

Courtesy of wysota, cũng như Qt giúp đỡ.

Khi bạn không cung cấp Q_OBJECT, lớp học của bạn không có dữ liệu Meta và do đó được coi là QWidget.

+0

, mặc dù vẫn làm việc để hiểu tại sao. – user7797

+1

Theo các tệp trợ giúp Qt, "Mọi tiện ích hiển thị nội dung tùy chỉnh phải triển khai paintEvent". Tôi chỉ có thể đoán rằng theo cơ chế phong cách mặc định của Qt vẽ điều khiển (QStyle :: drawControl) thực hiện một số bức vẽ mặc định cho QWidgets (như được xác định bởi dữ liệu meta là kết quả của Q_OBJECT trong QWidget). Ngay sau khi bạn cung cấp Q_OBJECT cho đạo hàm phụ tùng của riêng bạn, hành vi mặc định không giữ nữa, và drawControl của Qt bắt đầu dựa vào mã trong paintEvent để vẽ điều khiển. Tôi phải thừa nhận các tập tin trợ giúp không chỉ rõ lý do tại sao, nhưng chỉ rằng nó là bắt buộc. –

+1

Các lớp con trực tiếp của 'QWidget' vẫn cần ghi đè' paintEvent() 'ngay cả khi bạn cung cấp' Q_OBJECT'. –

0

Tôi không biết lý do tại sao chúng không hoạt động, nhưng tôi đã dịch để trăn mã trong câu trả lời của Werner Erasmus. "Làm việc cho tôi" sau đây là

def paintEvent(self, pe): 

    o = QStyleOption() 
    o.initFrom(self) 
    p = QPainter(self) 
    self.style().drawPrimitive(QStyle.PE_Widget, o, p, self)