2012-11-19 41 views
6

Sử dụng PyQt4, khi tôi ẩn một cửa sổ và hiển thị nó sau đó, nó xuất hiện ở vị trí khác (ít nhất là ở đây trên Linux). Mã ví dụ:PyQt4: Cửa sổ hiển thị ở vị trí khác sau khi ẩn() và hiển thị()

#!/usr/bin/python3 

from PyQt4.QtGui import * 

app = QApplication([]) 
widget = QWidget() 
widget.setLayout(QVBoxLayout()) 
label = QLabel() 
widget.layout().addWidget(label) 

def hideShow(): 
    widget.hide() 
    widget.show() 

widget.layout().addWidget(QPushButton('Hide/Show', clicked = hideShow)) 
widget.show() 
app.exec_() 

Cửa sổ biến mất và xuất hiện, nhưng hơi bên dưới và bên phải của vị trí ban đầu. Tôi nghĩ rằng nó bị thay đổi bởi kích thước của khung của trình quản lý cửa sổ xung quanh tiện ích thực tế.

Làm cách nào để đặt cửa sổ ở vị trí chính xác? Và tại sao nó lại di chuyển? Không nên nó ở đâu?

Trả lời

2

Trên Linux, vị trí cửa sổ có thể rất khó lường. Xem this section trong tài liệu Qt để biết các sự cố.

Có lẽ không có giải pháp chung cho vấn đề, nhưng đối với tôi, thiết lập hình học trước ban đầu show() dường như làm việc:

... 
widget.setGeometry(200, 200, 100, 50) 
widget.show() 
app.exec_() 

CẬP NHẬT

Sau một số thử nghiệm với KDE người quản lý cửa sổ, tôi có thể đã khám phá một giải pháp tiềm năng.

Dường như gọi show() ngay sau hide() không cung cấp cho người quản lý cửa sổ đủ thời gian để tính đúng vị trí cửa sổ. Vì vậy, giải pháp đơn giản là đặt rõ ràng hình học sau một khoảng thời gian nhỏ:

from PyQt4.QtGui import * 
from PyQt4.QtCore import QTimer 

app = QApplication([]) 
widget = QWidget() 
widget.setLayout(QVBoxLayout()) 
label = QLabel() 
widget.layout().addWidget(label) 

def hideShow(): 
    widget.hide() 
    QTimer.singleShot(25, showWidget) 

def showWidget(): 
    widget.setGeometry(widget.geometry()) 
    widget.show() 

widget.layout().addWidget(QPushButton('Hide/Show', clicked = hideShow)) 
widget.show() 
app.exec_() 

Điều này làm việc cho tôi sử dụng KDE-4.8 và OpenBox, nhưng tất nhiên là YMMV.

+0

Vâng, sau đó tôi nghĩ rằng người ta không thể giải quyết vấn đề này, như thiết lập hình học trước khi chương trình ban đầu() sẽ chỉ giúp khi ẩn và hiển thị cửa sổ được thực hiện từ vị trí đó và cửa sổ đã không được di chuyển. –

+0

@TobiasLeupold. Đối với tôi, việc di chuyển cửa sổ giữa các lần nhấp vào nút "Ẩn/Hiển thị" sẽ không tạo ra bất kỳ sự khác biệt nào (tức là vị trí vẫn không đổi). Nếu tôi nhận xét dòng 'setGeometry', cửa sổ nhảy lên và sang trái trên nhấp chuột * đầu tiên *, nhưng sau đó vẫn không đổi. Điều này đang sử dụng trình quản lý cửa sổ OpenBox. Bạn đang sử dụng trình quản lý cửa sổ nào? – ekhumoro

+0

Tôi sử dụng KDE 4.8.5 trên Gentoo Linux. –

0

Tôi đã gặp sự cố tương tự với xfce. Có lẽ bạn có thể có được vị trí trước khi ẩn nó (hoặc khi hiển thị nó, tùy thuộc vào những gì bạn muốn), lưu trữ nó đi, và sau đó đặt nó khi nó được hiển thị một lần nữa với setGeometry()? Một chút hacky có lẽ ..

+0

Tôi đã thử cả pos = widget.geometry() và pos = widget.frameGeometry() trước dấu cách hide() và widget.setGeometry (pos) không có hiệu lực. Cửa sổ xuất hiện ở cùng vị trí di dời. –

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