2010-02-10 28 views
8

Tôi đang xây dựng Dự án Symbian Qt và tôi muốn hiển thị thông báo cho người dùng sẽ tự động đóng sau một vài giây. Tôi đã thấy rằng Nokia sử dụng rất nhiều trong ui của họ.Tự động đóng QMessageBox

Hiện tại tôi đang sử dụng mã bên dưới để người dùng có thể đóng QMessageBox nhưng tôi muốn nó nếu có thể tự động đóng QMessageBox sau 1 hoặc 2 giây. Làm thế nào tôi có thể làm điều này bằng cách sử dụng Qt?

QMessageBox msgBox; 
msgBox.setText("Hello!"); 
msgBox.setIcon(QMessageBox::Information); 
msgBox.setStandardButtons(QMessageBox::Ok); 
msgBox.exec(); 

Trả lời

4

tôi sẽ đề nghị để phân lớp QMessageBox thêm hành vi mong muốn của riêng bạn ...

Nó sẽ là thú vị để thêm các phương pháp như setAutoClose(bool)setAutoCloseTimeout(int) và kích hoạt một QTimer trên showEvent khi tùy chọn Tự động đóng được kích hoạt!

Bằng cách này, bạn thậm chí có thể làm thay đổi apparence của QMessageBox của bạn và có một văn bản nói rằng "Hộp này sẽ tự động đóng lại trong vài giây XXX ..." hoặc một thanh tiến trình, vv ...

5

Nhờ thực sự nhiều ! Giải pháp của tôi:

Tôi tạo ra lớp của riêng tôi (MessageBox) đây là mã của tôi cho thấy điều đó:

MessageBox msgBox; 
msgBox.setText("Hello!"); 
msgBox.setIcon(QMessageBox::Information); 
msgBox.setStandardButtons(QMessageBox::Ok); 
msgBox.setAutoClose(true); 
msgBox.setTimeout(3); //Closes after three seconds 
msgBox.exec(); 

Đây là lớp học của tôi:

class MessageBox : public QMessageBox 

int timeout; 
bool autoClose; 
int currentTime; 

void MessageBox::showEvent (QShowEvent * event) { 
    currentTime = 0; 
    if (autoClose) { 
    this->startTimer(1000); 
    } 
} 

void MessageBox::timerEvent(QTimerEvent *event) 
{ 
    currentTime++; 
    if (currentTime>=timeout) { 
    this->done(0); 
    } 
} 
+0

định nghĩa của bạn về startTimer ở ​​đâu? – qed

+3

Bạn cũng có thể sử dụng phương thức QAbstractPushButton.animateClick bằng cách thêm 'msgBox.setStandardButtons (QMessageBox :: Ok); msgBox.button (QMessageBox :: Ok) .animateClick (thời gian chờ) ' –

1

Thay vào đó bạn có thể sử dụng Singleshot Timer để đóng bất kỳ hộp thoại nào hoặc QLabel rất dễ dàng:

QTimer *timer; 
QTimer::singleShot(10000, msgBox, SLOT(close())); 
Các vấn đề liên quan