2012-01-06 37 views
5

Tôi có hai QDialogs xếp chồng lên nhau, với một số dữ liệu được chia sẻ giữa chúng được hiển thị trong một QWidget trong bố cục của mỗi hộp thoại (một widget hiển thị một số đồ họa).Qt: Cập nhật các tiện ích con bị ẩn trước khi chúng được hiển thị?

Trong QDialog hiện được hiển thị, người dùng có thể thay đổi dữ liệu đó. Sự thay đổi này được truyền cho cả hai widget và số đếm chính xác được hiển thị trong QDialog hiện tại. Tuy nhiên, khi người dùng đóng QDialog đó và phần bên dưới sẽ hiển thị, QWidget hiển thị số đếm hiển thị giá trị cũ cho một giây thứ hai trước khi nó cập nhật giá trị chính xác.

Tôi biết rằng QWidget bên dưới có giá trị chính xác trước khi QDialog khác được hiển thị, nhưng tôi dường như không thể để Hộp thoại cập nhật trước khi hiển thị. Tôi cố gắng này trong khi nó vẫn còn ẩn:

hiddenDialog->layout()->activate()

hiddenDialog->layout()->update()

Nhưng nó vẫn không thực sự cập nhật cho đến khi sau khi hộp thoại được hiển thị. Vấn đề của tôi dường như sắp xếp liên quan đến Qt: How to force a hidden widget to calculate its layout?, ngoại trừ tôi muốn hiển thị QDialog sau khi thiết lập Qt :: WA_DontShowOnScreen trên. Sau khi bật Qt :: WA_DontShowOnScreen và cập nhật hộp thoại, tôi đã cố gắng thiết lập:

dialog->setAttribute(Qt::WA_DontShowOnScreen, false);

dialog->show()

Nhưng Dialog vẫn không được hiển thị trên màn hình. Có cách nào để làm cho nó có thể nhìn thấy một lần nữa? Hoặc có cách nào để cập nhật hộp thoại và tiện ích khi chúng bị ẩn bởi hộp thoại khác không?


Dưới đây là một số chi tiết theo yêu cầu: Có hai lớp, Dialog1 và Dialog2, mỗi mở rộng lớp cơ sở tương tự, BaseDialog, mà mở rộng lớp QDialog.

BaseDialog có một vị trí được gọi bất cứ khi nào GlobalCount được thay đổi. Khe này cập nhật một countWidget để vẽ một bức tranh về số lượng.

void BaseDialog::updateCountWidget() 
{ 
    _countWidget->updateCount(globalCount); 
    _countWidget->update(); 
} 

Dialog1 có một khe cắm (kết nối từ một nhấp chuột QPushButton()) mà tạo ra và cho thấy một Dialog2:

void Dialog1::showDialog2() 
{ 
    Dialog2* dialogTwo = new Dialog2(); 
    dialog2->show(); 
}  

Dialog2 có hai khe cắm (kết nối với tín hiệu QPushButton), một trừ từ toàn cầu đếm, người kia đóng hộp thoại. Khi tổng số toàn cầu bị trừ đi, nó phát ra tín hiệu kết nối với khe updateCountWidget() của cả Dialog1 và Dialog2.

void Dialog2::subtractCount() 
{ 
    GlobalCount.subtractOne(); 
} 

void Dialog2::userClosed() 
{ 
    accept(); 
} 

Khi tôi nhấp vào nút trừ, tôi có thể thấy cập nhật _countWidget Dialog2 chính xác. Tuy nhiên, khi tôi đóng Dialog2, và một lần nữa có thể thấy Dialog1, hàm _countWidget của Dialog1 hiển thị giá trị đếm ban đầu trong một giây, sau đó cập nhật giá trị mới.

Mục tiêu của tôi là ngăn cập nhật tạm thời này, vì nó trông thực sự thú vị đối với người dùng. Điều này đã nhận được khá lâu, nhưng tôi đánh giá cao bất kỳ thông tin chi tiết nào!

+0

Qt được nhúng chạy trên Linux. Tôi sẽ làm việc để có được một ví dụ hoàn chỉnh hơn một chút và có ý nghĩa. – Danny

+0

Tôi e rằng nó có thể phụ thuộc vào nội bộ nền tảng cơ bản, và cũng có thể thay đổi trên các hệ điều hành khác nhau. –

+0

có thể trùng lặp của [Qt: Làm thế nào để buộc một widget ẩn để tính toán bố trí của nó?] (Http://stackoverflow.com/questions/2427103/qt-how-to-force-a-hidden-widget-to-calculate- bố cục của nó) – emkey08

Trả lời

6

gọi

hide() 

trên widget khi bạn làm

setAttribute(Qt::WA_DontShowOnScreen, true); 

Sau đó

setAttribute(Qt::WA_DontShowOnScreen, false); 
show() 

và nó sẽ làm việc

tôi sử dụng Qt nhúng trên Linux

012.
+0

Làm việc thật tuyệt vời. Cảm ơn! – Danny

0

Bạn cũng có thể thử thực hiện hiddenDialog->layout()->update() trước ->activate(), hoạt động trong trường hợp tương tự đối với tôi và không cần phải gây rối với các thuộc tính WA_xxx là bắt buộc.

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