2010-08-06 39 views
6

Tôi đã thử này trong constructor mainform tôi:cách căn giữa biểu mẫu chính Qt trên màn hình?

QRect desktopRect = QApplication::desktop()->availableGeometry(this); 
move(desktopRect.center() - frameGeometry().center()); 

QRect desktopRect = QApplication::desktop()->availableGeometry(this); 
move(desktopRect.center() - rect().center()); 

nhưng cả hai đặt ở góc dưới bên phải của biểu mẫu ở khoảng trung tâm của màn hình, thay vì tập trung biểu mẫu. Ý tưởng nào?

Trả lời

10

Tôi đã thử này trong constructor mainform tôi

Đó là khả năng vấn đề. Có thể bạn không có thông tin hình học hợp lệ tại thời điểm này vì đối tượng không hiển thị.

Khi đối tượng được xây dựng đầu tiên, về cơ bản, đặt ở (0,0) với nó dự kiến ​​(width,height), như vậy:

frame geometry at construction: QRect(0,0 639x479) 

Nhưng, sau khi được hiển thị:

frame geometry rect: QRect(476,337 968x507) 

Vì vậy, bạn có thể không chưa dựa vào thông tin frameGeometry() của bạn.

EDIT: Với những gì đã nói, tôi đoán bạn có thể dễ dàng di chuyển nó như mong muốn, nhưng cho đầy đủ Tôi đang thả trong Patrice's code mà không phụ thuộc vào các thông tin khung hình học:

Rect desktopRect = QApplication::desktop()->availableGeometry(this); 
QPoint center = desktopRect.center(); 

move(center.x()-width()*0.5, center.y()-height()*0.5); 
+0

Tôi thấy nó hoạt động nếu tôi gọi 'this-> resize (width_I_want, height_I_want)' trước mã để căn giữa nó. Cảm ơn! –

+0

Điều đó thật thú vị. Làm thế nào để thay đổi hình dạng khung? –

3

Chức năng di chuyển (xem QWidget doc) nhận một tham số QPoint hoặc hai int làm tham số. Điều này tương ứng với các tọa độ của góc trên bên trái của Widget của bạn (liên quan đến cha mẹ của nó; Here OS Desktop). Hãy thử:

QRect desktopRect = QApplication::desktop()->availableGeometry(this); 
QPoint center = desktopRect.center(); 

move(center.x()-width*0.5, center.y()-height*0.5); 
0

Một giải pháp, giả sử cửa sổ trong câu hỏi là 800 × 800:

QRect rec = QApplication::desktop()->availableGeometry(); 
move(QPoint((rec.width()-800)/2, (rec.height()-800)/2)); 
Các vấn đề liên quan