2013-02-20 33 views
11

Về cơ bản tôi có một số QGridLayout với một vài tiện ích trong đó. Những cái quan trọng là 2 nhãn, mà tôi sử dụng để vẽ hình ảnh lên màn hình. Vâng, nếu người dùng muốn, anh ta có thể thay đổi độ phân giải của hình ảnh đến, do đó, buộc các Nhãn để thay đổi kích cỡ.Bố cục Qt, đổi kích thước thành tối thiểu sau khi thay đổi kích thước tiện ích

Giả sử kích thước ban đầu của nhãn là 320x240. Người dùng thay đổi VideoMode thành 640x480, nhãn và toàn bộ GUI thay đổi kích thước hoàn hảo. Nhưng khi người dùng chuyển về 320x240, nhãn co lại, nhưng Bố cục/Cửa sổ KHÔNG.

Tôi đã chơi xung quanh với sizePoliciessizeHintsresize(0,0), nhưng không có mẹo nào xảy ra. Ai đó có thể giúp tôi với điều này?

Dưới đây một số ảnh chụp màn hình để làm rõ các vấn đề:

Here, everything is okay still, 640 x 480 resizes perfectly but here, the layout is too big.

Trả lời

21

Bạn cần phải thiết lập các hạn chế kích thước của bố trí giữ tất cả các bạn tiện ích con cho "SetFixedSize". Mặc dù tên không có vẻ như nó sẽ làm việc, nó đảm bảo rằng bố trí của bạn sẽ chỉ sử dụng không gian cần thiết. Bạn sẽ không có vấn đề như bạn làm trong ảnh chụp màn hình thứ hai của bạn.

Ví dụ:

mainLayout.setSizeConstraint(QLayout::SetFixedSize); 
+2

Cảm ơn bạn! Điều này đã tiết kiệm cho tôi một vài giờ tìm kiếm và gỡ lỗi gây ra bởi việc đặt tên khủng khiếp này. Tại sao SetFixedSize ngụ ý "tự động thay đổi kích thước thành kích thước tối thiểu" là ngữ nghĩa KHÔNG phải là kích thước cố định vì kích thước tối thiểu phụ thuộc vào kích thước (có khả năng động) của nội dung của tiện ích? Có bất kỳ lời giải thích cho điều này? – hna

+0

Tên không có ý nghĩa nhiều, và nó được một thời gian kể từ khi tôi làm việc với Qt, vì vậy tôi không nhớ làm thế nào tôi tìm thấy điều này. Nhưng vấn đề này làm tôi thất vọng một lúc. Rất vui khi nó giúp bạn – user929404

+0

Điều này dường như hoạt động với mọi thứ ngoại trừ tiện ích QScrollArea. Bạn có biết một giải pháp cho điều đó không? – Assimilater

1

Bạn cần lưu trữ kích thước ban đầu của cửa sổ cha mẹ widget của bạn trước khi áp dụng bất kỳ thay đổi cách bố trí và khôi phục lại nó khi người dùng chuyển về bản gốc.

Chú ý rằng bạn cần phải làm việc với kích thước cửa sổ cha mẹ phụ tùng và không phải là phụ tùng mẹ kích thước.

trong widget của bạn trước khi áp dụng những thay đổi bố cục:

minimumWindowSize = this->window().size(); 

khi bạn đã hoàn thành việc tổ chức lại các widget với kích thước nhỏ gọn

this->window().resize(minimumWindowSize); 
+0

cảm ơn bạn, tôi sẽ cố gắng trong vài phút nữa. thực tế là có nhiều kết hợp độ phân giải khác nhau, từ 320x240 đến 1280x1024. Nó sẽ mất đến 10 cấu hình kích thước. Không có cách nào Qt tự động thực hiện điều này? – Hafnernuss

+0

Tôi đã không kiểm tra nó, nhưng bạn có thể thử bằng cách chỉ lưu trữ kích thước tối thiểu (hoặc thậm chí cung cấp một kích thước null). Nếu tôi đúng QT nên tự động tăng kích thước cửa sổ lên giá trị tối thiểu để hiển thị tất cả các tiện ích có sẵn – Pierluigi

1

Vì vậy, đó là chính xác những gì tôi đang làm trong dự án mu. Độ phân giải os không quan trọng. Tôi chỉ có một tiện ích để hiển thị video hoặc hình ảnh trong trường hợp của bạn.

void MainWindow::resizeEvent(QResizeEvent* event) 
{ 
    QMainWindow::resizeEvent(event); 
    if ((player != 0) && ((player->isPlaying()) || player->isLoaded() || player>isLoaded())){ 
    renderer->resize(ui->mainVideoWidget->width(),ui->mainVideoWidget->height()); 
    resizeFilter(); 

} 
} 
5

QLayout :: setSizeConstraint (QLayout :: SetFixedSize) giải quyết vấn đề này tốt khi bạn muốn giữ kích thước của widget của bạn cố định tại mọi thời điểm - có nghĩa là, nếu bạn muốn nó luôn luôn được gắn cố định của nó " kích thước "đóng gói (có thể vẫn thay đổi khi kích thước thay đổi của tiện ích con). Đó là những gì "cố định" có nghĩa là có: "cố định" với kích thước chính xác, ngay cả khi sau này thay đổi. (Trong thuật ngữ Qt, những gì tôi gọi là kích thước "đóng gói" chỉ đơn giản là kích thước của widget.)

Nhưng một ràng buộc có thể là một giải pháp quá mạnh trong một số trường hợp. Đặc biệt, nếu bạn áp dụng nó vào một cửa sổ cấp cao nhất, thì người dùng sẽ không được tự do thay đổi kích thước cửa sổ. Nếu bạn không thích điều đó, thay vào đó bạn có thể thực hiện thao tác "set size to sizeHint" ngay lập tức mỗi khi cần, thay vì áp đặt nó như một ràng buộc không ngừng. Cách để làm điều đó là gọi QWidget :: adjustSize().

http://doc.qt.io/qt-5/qwidget.html#adjustSize

Lưu ý rằng nếu container có con em đang thay đổi kích thước không phải là cửa sổ cấp cao nhất, sau đó adjustSize() có thể phải được gọi là đệ quy trên thùng và cha mẹ của nó. (Trong trường hợp của tôi, tôi cũng phải làm điều đó, tôi cũng đã thử lược đồ ràng buộc kích thước, và thấy rằng việc áp dụng ràng buộc ở mức cao nhất đã thành công trong việc nén tất cả các cấp. Tôi chưa đủ kiến ​​thức về Qt để bình luận một cách hữu ích. trên những quan sát này, vì vậy tôi chỉ chia sẻ chúng.)

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