2011-07-10 28 views
9

Tôi đã tạo 2 hàng nút nhấn, mỗi hàng nằm trong QHBoxLayout. enter image description hereKích thước/chiều rộng tối thiểu của QPushButton được tạo từ mã

tôi có thể tạo các nút trong các mã:

static const char* buttonText = "23456789TJQKA"; 
for (int ii = 0; buttonText[ii]; ii++) 
{ 
    QPushButton* pushButton = new QPushButton(this); 
    pushButton->setText(QString(buttonText[ii])); 
    ui->horizontalLayout_1->addWidget(pushButton); 
} 
for (int ii = 0; buttonText[ii]; ii++) 
{ 
    QPushButton* pushButton = new QPushButton(this); 
    pushButton->setText(QString(buttonText[ii])); 
    ui->horizontalLayout_2->addWidget(pushButton); 
} 

Vấn đề là họ không thể co lại (khi người dùng thay đổi kích thước hộp thoại) vượt quá kích thước đó, mặc dù văn bản của họ sẽ phù hợp trong một chiều rộng nhỏ hơn nhiều. Nếu tôi tạo các nút thủ công trong trình chỉnh sửa tài nguyên thay vì trong mã, chúng có thể có chiều rộng nhỏ hơn.

+4

Hãy thử với QToolButton. –

+0

Đã hoạt động! Cảm ơn. Nếu bạn đăng câu trả lời này, tôi có thể chọn nó làm câu trả lời được chấp nhận. Nhưng tại sao thay đổi kích thước công việc cho QToolButton nhưng không cho QPushButton? – sashoalm

+0

QToolButton và QPushButton có các kiểu mặc định khác nhau. Ví dụ, một QPushButton có chiều rộng tối thiểu khoảng 6em. Có nghĩa là, chiều rộng của 6 ký tự (trong phông chữ mà bạn đang sử dụng). QToolButton, bởi vì nó thường được sử dụng cho hình ảnh, hoặc "...", những thứ như vậy, có chiều rộng tối thiểu nhỏ hơn nhiều - như 2em. QPushButton, cũng thường có nhiều lề trái/phải hơn. Nếu bạn bắt đầu chơi với phong cách trang tính này là một cái gì đó bạn có thể tinker với. – Liz

Trả lời

6

Điều này xảy ra bởi vì minimumSizeHint của QPushButton không cho phép QLayout để thay đổi kích thước:

Việc thực hiện mặc định của minimumSizeHint() trả về một kích thước không hợp lệ nếu không có bố trí cho widget này, và trả về kích thước tối thiểu của bố cục là . Hầu hết các tiện ích tích hợp sẵn sẽ thực hiện lại minimumSizeHint().

QLayout sẽ không bao giờ đổi kích thước tiện ích con thành kích thước nhỏ hơn mức tối thiểu gợi ý kích thước trừ khi MinimumSize() được đặt hoặc chính sách kích thước được đặt thành QSizePolicy :: Bỏ qua. Nếu minimumSize() được đặt, gợi ý kích thước tối thiểu sẽ bị bỏ qua.

Giải pháp đơn giản là để thiết lập chiều rộng tối thiểu một cách rõ ràng:

static const char* buttonText = "23456789TJQKA"; 
for (int ii = 0; buttonText[ii]; ii++) 
{ 
    QPushButton* pushButton = new QPushButton(this); 
    pushButton->setMinimumWidth(5); 
    pushButton->setText(QString(buttonText[ii])); 
    ui->horizontalLayout_1->addWidget(pushButton); 
} 
for (int ii = 0; buttonText[ii]; ii++) 
{ 
    QPushButton* pushButton = new QPushButton(this); 
    pushButton->setMinimumWidth(5); 
    pushButton->setText(QString(buttonText[ii])); 
    ui->horizontalLayout_2->addWidget(pushButton); 
} 
4

Như pnezis viết, bạn có thể muốn ghi đè mặc định kích thước tối thiểu tính bằng nút. Đây là một cách bạn có thể làm điều đó trong khi tránh để chọn kích thước tùy ý có thể không hoạt động khi điều kiện khác nhau (khác nhau chữ hoặc kích thước phông chữ, phong cách giao diện người dùng, vv):

QWidget* parent = /* some widget */ 
auto button = new QPushButton(QLatin1String("X"), parent); 
auto textSize = button->fontMetrics().size(Qt::TextShowMnemonic, button->text()); 
QStyleOptionButton opt; 
opt.initFrom(button); 
opt.rect.setSize(textSize); 
button->setMinimumSize(
    button->style()->sizeFromContents(QStyle::CT_PushButton, 
            &opt, 
            textSize, 
            button)); 

Trên đây đã được chuyển thể và đơn giản hóa từ riêng của QPushButton mã. Bạn có thể muốn xem nguồn của QPushButton :: sizeHint cho tất cả các chi tiết.

1

setMaximumWidth phù hợp với tôi. mã mẫu nằm trong pyqt, nhưng nó phải dịch trực tiếp sang C++ mà không gặp bất kỳ sự cố nào.

from PyQt4 import QtGui 

class Window(QtGui.QWidget): 
    def __init__(self): 
     super(Window, self).__init__() 
     layout = QtGui.QHBoxLayout() 
     texts = [":)", 
       "&Short", 
       "&Longer", 
       "&Different && text", 
       "More && text", 
       "Even longer button text", ] 
     for text in texts: 
      btn = QtGui.QPushButton(text) 
      double = text.count('&&') 
      text = text.replace('&', '') + ('&' * double) 
      width = btn.fontMetrics().boundingRect(text).width() + 7 
      btn.setMaximumWidth(width) 
      layout.addWidget(btn) 
     self.setLayout(layout) 

if __name__ == '__main__': 
    import sys 

    app = QtGui.QApplication(sys.argv) 
    mainWin = Window() 
    mainWin.show() 
    sys.exit(app.exec_()) 
Các vấn đề liên quan