Windows quản lý Quyết định
Trước khi tôi bắt đầu: Như đã chỉ ra bởi elcuco và Javier, tập trung chính sách và các khía cạnh khác của các cửa sổ bố trí (ví dụ như thanh tiêu đề) thuộc về một đáng kể mở rộng đến các cửa sổ tương ứng người quản lý và Qt có thể có quyền kiểm soát giới hạn. Để thấy điều này, chỉ cần nhìn vào giao diện người dùng có chính sách "focus follows mouse". Trong những trường hợp này, trình quản lý cửa sổ có thể bỏ qua yêu cầu lấy nét của Qt. Vì lý do này, tài liệu Qt gọi nhiều cờ "gợi ý" tương ứng. Do đó, một số giải pháp được đề xuất có thể hoặc có thể không hoạt động cho bạn.
QApplication :: setActiveWindow()
không chịu được, e.tadeu's Giải pháp này sử dụng QApplication::setActiveWindow()
công trình đối với tôi cho cả Windows và Ubuntu với Gnome. Tôi đã thử nghiệm nó với mã sau đây. Xin lỗi rằng nó là Python sử dụng PyQt (tôi sử dụng các câu hỏi như thế này để tìm hiểu một chút về PyQt). Nó sẽ khá dễ dàng để bạn đọc nó và dịch nó sang C++.
import sys
from PyQt4 import QtGui
from PyQt4 import QtCore
class MainWindow(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self)
# main window
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Test')
# text editor
self.textEdit = QtGui.QTextEdit()
self.setCentralWidget(self.textEdit)
def closeEvent(self, event):
QtGui.QApplication.instance().quit()
#main
app = QtGui.QApplication(sys.argv)
testWindow = MainWindow()
testWindow.setWindowFlags(QtCore.Qt.Tool)
testWindow.show()
app.setActiveWindow(testWindow)
app.exec_()
Lưu ý rằng bạn cần phải thêm một số xử lý trường hợp chặt chẽ của các testWindow
, bởi vì các ứng dụng không thoát tự động nếu bạn đóng cửa sổ Qt::Tool
.
Các grabKeyboard() Hack
Nếu điều này không làm việc cho bạn, hack sức sau. Tôi cho rằng bạn có một cửa sổ trong ứng dụng đang hoạt động. Sau đó, bạn có thể sử dụng grabKeyboard()
để chuyển hướng đầu vào. Cửa sổ Qt::Tool
không lấy nét nhưng nhận được đầu vào. Mã chính sau đây minh họa nó (mã khác vẫn không thay đổi).
#main
app = QtGui.QApplication(sys.argv)
testWindow = MainWindow()
testWindow.setWindowFlags(QtCore.Qt.Tool)
testWindow2 = MainWindow() # second window which is active
testWindow2.show()
testWindow.show()
testWindow.textEdit.grabKeyboard()
app.exec_()
Về cơ bản, trong khi các cửa sổ testWindow2
là một trong những hoạt động, tất cả các văn bản đã nhập xuất hiện trong testWindow.textEdit
. Nó không phải là đẹp, tôi biết ...
Tạo Window riêng của bạn
Bạn có được sự linh hoạt nhất (và tạo công việc nhất cho chính mình) bằng cách tung ra bố trí cửa sổ của riêng bạn. Ý tưởng được mô tả trong FAQ sau đây.
"Giải pháp" Khác
Bạn trực tiếp có thể gọi hàm API quản lý cửa sổ của tương ứng để có được kết quả mong muốn (rõ ràng so với lý do rất sử dụng Qt ở nơi đầu tiên). Bạn cũng có thể hack mã nguồn Qt.Ví dụ, trên Windows, Qt sử dụng chức năng ShowWindow()
với cờ SW_SHOWNOACTIVATE
, để hiển thị cửa sổ theo kiểu WS_EX_TOOLWINDOW
nếu bạn đặt cờ Qt::Tool
. Bạn có thể dễ dàng thay thế SW_SHOWNOACTIVATE
bằng bất kỳ thứ gì bạn muốn. Linux phải giống nhau. Rõ ràng cũng không được khuyến khích.
Đã thêm thông tin vào bài đăng. – Ockonal