2010-02-16 30 views
12

Tôi có một QScrollArea cha đẻ tiện ích cuộn tuyệt vời của tôi. Tôi thích cập nhật nội dung trong những dịp khác nhau.update() hoặc repaint() không kích hoạt paintEvent()

Vì điều này, tôi đã ghi đè paintEvent(QPaintEvent *). Sau đó, mỗi khi tôi muốn nó được thực hiện tôi gọi update() trên widget.

Sự cố:paintEvent() không bao giờ được gọi bằng cách này!

Những gì tôi cố gắng trong xử lý sự cố cho đến nay:

  • Sử dụng repaint() thay vì update(). Nên gọi nó ngay lập tức. Thật không may thì không.
  • Kiểm tra isVisible()updatesEnabled
  • Kiểm tra thời gian ghi đè của tôi là chính xác. Thay đổi kích thước cửa sổ gọi hàm của tôi. Chỉ các cuộc gọi cập nhật thủ công(), repaint() của tôi không thành công.
  • Thực hiện QTimer để kích hoạt cập nhật() hoặc sơn lại() sau mỗi 500ms. Trình kích hoạt cho đầu ra văn bản, chức năng này không được gọi.

Bất kỳ ai có ý tưởng gì cần kiểm tra tiếp theo? Điều gì có thể làm cho repaint() không phải gọi paintEvent()?

+0

Không vẽ trên QScrollArea, mà thay vào đó QLabel được chỉ định của nó giải quyết được sự cố cho tôi. Tôi nhận được bản cập nhật() s cho QLabel. – ypnos

+0

bạn có thể dán định nghĩa tiêu đề/lớp của mình không? Bạn có tất cả các macro Q_OBJECT của bạn trong đó không? cũng đưa ra một đoạn trích ngắn về cách bạn đang ghi đè paintEvent của bạn() ... – bgs

Trả lời

22

Giải pháp là gọi this->viewport()->repaint() hoặc this->viewport()->update() từ lớp QAbstractScrollArea có nguồn gốc thay vì chỉ repaint() hoặc update().

Thông tin thêm được đưa ra trong Qt documentation:

QWidget * QAbstractScrollArea::viewport() const

Trả widget viewport. Sử dụng chức năng QScrollArea::widget() để truy xuất nội dung của tiện ích khung nhìn.

Kể từ khi nội dung mà chúng tôi có trong QAbstractScrollArea lớp được thừa kế của chúng tôi sẽ được hiển thị trong các phụ tùng khung nhìn, làm cho tinh thần để gọi cập nhật viewport phụ tùng hay sơn lại để vẽ dữ liệu của chúng tôi một lần nữa (có gọi chúng tôi paintEvent).

+0

Về cơ bản đây là câu trả lời đúng. Lỗi của tôi là tôi đã tạo ra widget tùy chỉnh của mình từ QScrollArea và nghĩ rằng tôi có thể vẽ bản vẽ cá nhân của mình ở đó. Thay vào đó, tôi sẽ phải ghi đè lên chức năng vẽ của khung nhìn, có lẽ là không thể. – ypnos

+0

Có thể ghi đè lên chức năng vẽ của khung nhìn. Chỉ có một thứ bạn cần quan tâm trong paintEvent() là thay vì truyền con trỏ "this" như một cái bình thường trong khi tạo đối tượng QPainter, vượt qua this-> viewport(). QPainter (this-> viewport()) thay vì QPainter (điều này). Nếu không, lỗi "QPainter không hoạt động" sẽ bị ném. – Abhiram

+0

Điều này áp dụng cho bất kỳ tiện ích 'ưa thích' nào sử dụng QAbstractScrollArea, như QTableWidget. Cảm ơn một tấn vì đã chỉ ra điều này! – eresonance

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