2010-01-12 12 views
14

Tôi mới tham gia QT. Tôi hiểu rằng bạn có thể buộc một màn hình làm mới, nhưng tôi đã kéo tất cả tóc của tôi ra cố gắng tìm ra cách. Đây là những gì tôi đang cố gắng làm.QT Gửi lại/Làm lại/Cập nhật/Làm điều gì đó

Tôi nhấn một nút (sự kiện tín hiệu onClick), chạy mã thay đổi hình ảnh (QLabel) trên màn hình, chờ đầu vào và sau đó tiến hành bằng cách thay đổi hình ảnh mới (nhãn hiệu khác). Tôi đã thử mọi thứ và màn hình không làm mới cho đến khi mã sự kiện tín hiệu onclick hoàn tất. Ngay bây giờ, tôi không chờ đợi cho người sử dụng đầu vào, tôi đang sử dụng chúng tôi ngủ (~ 500 ms) cho mục đích thử nghiệm. Từ những gì tôi đọc, QT là sự kiện có nghĩa là tôi đang tạo ra một loạt các sự kiện, được đặt trong một hàng đợi và được thực hiện khi (sự kiện tín hiệu onClick) quay trở lại (vòng lặp chính)/(xử lý sự kiện). Tôi không muốn đợi cho đến khi chức năng được hoàn thành, nó sẽ làm cho lập trình cực kỳ đau đớn nếu tôi phải hoàn thành thói quen này hoàn toàn dựa trên các sự kiện.

Tôi làm cách nào để buộc bản đồ pixabel của QLabel làm mới. Tôi đã thử mọi thứ. Dưới đây là tất cả mã tôi đã thử trong trình xử lý sự kiện onClick tín hiệu của mình. (upButton là tên của QLabel là một pixmap)

update(); 
repaint(); 
ui->upButton->setUpdatesEnabled(TRUE); 
update(); 
repaint(); 
QPaintEvent paintevent(ui->upButton->childrenRegion()); 
QPaintEvent * test = &paintevent; 
paintEvent(test); 
this->changeEvent(test); 
ui->upButton->update(); 
ui->upButton->repaint(); 
ui->upButton->repaint(ui->upButton->childrenRegion()); 
repaint(); 
QApplication::sendPostedEvents(); 
this->parentWidget()->update(); 
usleep(100000); 

Như bạn có thể thấy, tôi chỉ chụp trong bóng tối vào thời điểm này. Tôi đã cố gắng xem xét mã mẫu và làm tất cả các bài tập ở nhà của tôi, nhưng tôi bị mất. Đánh giá cao bất kỳ trợ giúp, lời khuyên và mã mẫu nào.

+2

Trong các hệ thống GUI theo hướng sự kiện, bạn thường không "đợi nhập" trong các cuộc gọi lại của mình. Trạng thái chờ đầu vào có nghĩa là bạn đang ở trong vòng lặp sự kiện. Vì vậy, tôi nhầm lẫn lý do tại sao bạn sẽ sử dụng chúng tôi ngủ cho bất cứ điều gì - bạn thường nghĩ gì khi gọi * khi bạn * sẽ xử lý đầu vào của người dùng? Đừng lo lắng về các sự kiện đau đớn ... tín hiệu và khe không cắn (thường). – HostileFork

Trả lời

7

Bạn không nên đợi đầu vào trong trình xử lý sự kiện của mình. Bạn cần phải suy nghĩ lại logic của chương trình của bạn để sử dụng các sự kiện theo cách mà chúng được dự định. Tất cả các cuộc gọi update() và repaint() trong mã của bạn là không cần thiết nếu bạn quay trở lại vòng lặp sự kiện.

19

Tôi đã sử dụng giấc ngủ để mô phỏng một khoảng thời gian ngắn máy tính đang chờ đợi điều gì đó xảy ra.

Như tôi đã nêu trong câu hỏi của mình, tôi không muốn sử dụng các sự kiện vì đó là toàn bộ rất nhiều công việc không cần thiết để thực hiện điều gì đó cực kỳ đơn giản.

Ngoài ra, 'sự kiện' cần phải diễn ra để chương trình tiếp tục, là sự kiện USB. Kể từ khi tôi đang sử dụng một thiết bị lớp HID, không có cách nào để thiết lập một sự kiện xảy ra mà không có một vòng lặp chờ đợi. Các lớp USB HID không cho phép thiết lập ngắt, hệ điều hành xác nhận thiết bị.

Tôi đã quản lý để các tính năng trên hoạt động. Tôi đã đi qua trình gỡ lỗi và nhận thấy màn hình sẽ làm mới trước chức năng ngủ. Chạy chương trình độc lập, tôi nhận được kết quả ngẫu nhiên với màn hình làm mới 1% thời gian. Tôi đã thoát khỏi chức năng ngủ, và thêm một số mã khác ở nơi đó để mô phỏng một sự chậm trễ, và nó đã được sử dụng tốt.

Chỉ cần cho kiến ​​thức của mọi người, điều này là có thể, nó không bị cấm, và thật dễ dàng để làm những điều sau:

qApp->processEvents(); 

qApp là một biến bên ngoài toàn cầu trong tiêu đề QApplication.

Bởi vì sự kiện USB này đang làm cho luồng của tôi trở nên phức tạp, tôi tình cờ gặp Lớp QWaitCondition. Tôi sẽ bắt đầu một quá trình chờ đợi sự kiện USB. Tôi sẽ đợi cho đến khi quá trình giải phóng tình trạng chờ đợi cho thói quen của tôi để tiếp tục.

Nhưng nếu có ai nghĩ đây là một ý tưởng tồi, vui lòng nói ra. Tôi thực sự đánh giá cao phản hồi của bạn PiedPiper và Hostile Fork.

Cảm ơn bạn.

2

Nếu tôi hiểu chính xác, bạn có một khe và trong khe này, bạn cập nhật hình ảnh được hiển thị trong nhãn hiệu. Nhưng bạn muốn thay đổi này được hiển thị trước khi vị trí kết thúc.

Nếu đúng như vậy, hãy phát hành sự kiện update() và gọi qApp-> processEvents(). Phương thức này xử lý các sự kiện đang đợi trong hàng đợi sự kiện và sau đó trả về, do đó, đây có thể là những gì bạn đang làm sau.

PS: bản cập nhật() có thể không cần thiết chút nào, tôi không chắc chắn.

2

Tôi nhận thấy đôi khi bạn có nhiều tiện ích lớp hoặc tiện ích con bên trong tiện ích con giúp gọi các sự kiện repaint() của họ.

Ví dụ

this->repaint(); 
this->parentWidget()->repaint(); 
this->parentWidget()->parentWidget()->repaint(); 

này là xa dễ dàng hơn sau đó đẩy ra bất kỳ xử lý đề tài khác, hoặc tạo ra các xử lý sự kiện bổ sung.

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