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:
Đâ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.
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
@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ụ.) –
@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. –