2009-06-27 78 views
13

tôi có QMainWindow. Nó có các thông số này:Kích hoạt cửa sổ

this->setWindowFlags(Qt::Tool); 
this->setFocusPolicy(Qt::StrongFocus); 
this->setAttribute(Qt::WA_QuitOnClose,true); 

Sau showEvent Calles cửa sổ của tôi được hiển thị nhưng unactivated. Tôi đã cố gắng quá tải chức năng hiển thị:

...  
QMainWindow::showEvent(event); 
this->activateWindow(); 
... 

Nhưng nó không giúp tôi.

EDIT: Khi tôi nhận xét dòng

this->setWindowFlags(Qt::Tool); 

mọi thứ đều hoạt động tốt, nhưng tôi cần trong công cụ cờ. Bất kỳ ý tưởng nào?

EDIT:

  • Hệ điều hành: Linux
  • Lập trình ngôn ngữ: C++
  • Qt phiên bản: 4.5.1

Trả lời

13

Windows quản lý Quyết định

Trước khi tôi bắt đầu: Như đã chỉ ra bởi elcucoJavier, 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.

1

Những hệ điều hành? Qt4 nào?

Trên Linux bạn phải chịu số phận, người quản lý cửa sổ có thể bỏ qua những gì bạn đang nói với anh ấy. Giữ nó được xem xét.

+0

Đã thêm thông tin vào bài đăng. – Ockonal

0

Điều tương tự có xảy ra nếu bạn chỉ tạo một QWidget thông thường thay vì QMainWindow không?

Ngoài ra, có lẽ bạn có thể cố gắng đạt được bất kỳ hiệu ứng nào bạn cần Qt :: Công cụ cho các phương tiện khác nếu có thể?

3

Cố gắng sử dụng QApplication :: setActiveWindow()

4

Quả táo gốc Giao diện Hướng dẫn Nhân (*) nói rằng cửa sổ hộp công cụ là "luôn luôn trên đầu nhưng không bao giờ kích hoạt". Nó cũng khuyên chống lại việc sử dụng các hộp văn bản trên chúng, chính xác vì thiếu phản hồi trạng thái kích hoạt.

Kiểm tra cách ứng dụng 'hộp công cụ nặng' khác hoạt động. Tôi nhớ lại rằng ít nhất GIMP và InkScape có vẻ rất khác trong khía cạnh này.

Khi elcuco cho biết, trình quản lý cửa sổ có thể thực hiện bất cứ điều gì nó muốn với cờ của Qt. Ngoài ra, nó chắc chắn sẽ khác nhau dưới KDE, Gnome, fluxbox, bất cứ điều gì.

(*): tài liệu tuyệt vời! hơi lỗi thời; nhưng cửa sổ công cụ đã được sử dụng và coi

0

Về Qt :: Tool WindowFlags Để trích dẫn tài liệu Qt

Chỉ ra rằng widget là một công cụ cửa sổ. Cửa sổ công cụ thường là cửa sổ nhỏ có thanh và trang trí nhỏ hơn bình thường , thường được sử dụng cho các bộ công cụ . Nó có là một phụ huynh, cửa sổ công cụ sẽ luôn được giữ trên đầu trang của nó.Nếu có không phải là cha mẹ, bạn cũng có thể xem xét sử dụng Qt :: WindowStaysOnTopHint. Nếu hệ thống cửa sổ hỗ trợ nó, một cửa sổ công cụ có thể được trang trí với khung hình hơi nhạt hơn . Nó cũng có thể được kết hợp với Qt :: FramelessWindowHint

Có vẻ như những lá cờ là một vấn đề và sử dụng Qt :: WindowStaysOnTopHint nên giải quyết vấn đề của bạn.

0

Chỉ cần gọi show() sau setWindowFlags().

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