2010-10-20 40 views
11

Tôi cần đặt một số phiên bản của một lớp con tùy chỉnh QPushButton liền kề với nhau. Vì một số lý do, các nút chồng lên nhau khi được sơn. Một ví dụ đơn giản của vấn đề là dưới đây.Tại sao QHBoxLayout khiến tiện ích chồng lên nhau?

Đây là (không chính xác) đầu ra:

overlapping

Đây là mã:

#include <QtGui> 

class MyButton : public QPushButton { 
public: 
    explicit MyButton(Qt::GlobalColor color, QWidget *parent = NULL) 
    : QPushButton(parent), color_(color) { 
    setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); 
    } 
    QSize sizeHint() const { 
    return QSize(50, 25); 
    } 
protected: 
    void paintEvent(QPaintEvent *) { 
    QPainter painter(this); 
    painter.setOpacity(0.5); 
    painter.fillRect(0, 0, width(), height(), color_); 
    } 
private: 
    Qt::GlobalColor color_; 
}; 

int main(int argc, char **argv) { 
    QApplication app(argc, argv); 
    QWidget widget; 
    QHBoxLayout *layout = new QHBoxLayout; 
    layout->setSpacing(0); 
    MyButton *w1 = new MyButton(Qt::red); 
    MyButton *w2 = new MyButton(Qt::green); 
    MyButton *w3 = new MyButton(Qt::blue); 
    layout->addWidget(w1); 
    layout->addWidget(w2); 
    layout->addWidget(w3); 
    widget.setLayout(layout); 
    widget.show(); 
    return app.exec(); 
} 

gì đang gây ra điều này, và làm thế nào để sửa chữa nó? BTW, tôi đã thử một cái gì đó tương tự với các lớp con QWidget thường xuyên (thay vì QPushButton lớp con), và không có vấn đề gì. Đó là điều gì đó khác thường với QPushButton.

CẬP NHẬT: Tôi thực sự nghĩ rằng đây là lỗi. Tôi đã gửi nó đến số Qt Bug Tracker; chúng ta sẽ thấy những gì các Troll nghĩ. Trong mọi trường hợp, phát sinh từ QAbstractButton khắc phục sự cố bản vẽ ... Tôi chỉ phải triển khai lại một số chức năng tôi cần.

CẬP NHẬT 2: Trolls tại Qt cung cấp giải pháp (giải pháp thay thế?); Tôi đã đăng bản sửa lỗi của họ dưới dạng câu trả lời bên dưới. Tôi để nó cho nhóm của họ để xác định xem đây là một tính năng hay lỗi. Nó dường như chỉ hành xử khác nhau trên máy Mac.

+1

Tôi không thấy bất kỳ điều gì sửa đổi kích thước nút bấm của bạn. Bạn chỉ định rằng nó sẽ được cố định và sizeHint, nhưng không phải là kích thước thực. Bạn làm điều đó trong mã thực sự của bạn hay không? – Live

+0

@Live: Nhưng đó không phải là điểm của QHBoxLayout? Nó không phải là sử dụng các gợi ý kích thước để xác định kích thước lý tưởng cho mỗi widget? (Cho phép một số mở rộng/hợp đồng nếu gợi ý kích thước và chính sách cho phép, ví dụ.) –

+0

@Live: Tôi đã xác minh rằng các kích thước là OK. Nếu bạn thực hiện một qDebug() << size(), nó là chính xác. –

Trả lời

11

Giải pháp là để thêm dòng sau vào các lớp con:

setAttribute(Qt::WA_LayoutUsesWidgetRect); 

Rõ ràng nó chỉ là cần thiết trên nền tảng Mac; Windows và Linux hiển thị bố trí như mong đợi.

+0

bạn đã thêm địa chỉ này ở đâu? – chacham15

+0

@ chacham15: Bạn có thể thêm nó vào hàm tạo của lớp con, 'MyButton' trong ví dụ trên của tôi. –

0

Thay vì gọi setSizePolicy() và reimplement sizeHint(), tôi sẽ cố gắng để chỉ cần gọi

setFixedSize(50, 25)

trong constructor của bạn. Điều này sẽ tự cập nhật sizeHint.

Hy vọng điều này sẽ hữu ích.

+0

'setFixedSize' gây ra cùng một hành vi. Tôi thực sự bắt đầu nghĩ đây chỉ là một lỗi. –

0

Mã của bạn hoạt động tốt cho tôi. Tôi đã thử nghiệm nó. Bạn sử dụng phiên bản nào? Tôi sử dụng Qt 4.6.3 và nó là tốt.

+0

Tôi đang sử dụng Mac OS X 10.6.4; Qt 4.7.0 –

+0

Tôi nghĩ đó là vấn đề. Có thể nó là một lỗi. – Narek

Các vấn đề liên quan