2009-06-27 15 views
13

मेरे पास QMainWindow है। यह इस पैरामीटर:विंडो सक्रिय करें

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

showEvent calles के बाद अपनी खिड़की से पता चला लेकिन unactivated है। मैं इस शो समारोह ओवरलोड करने की कोशिश की:

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

लेकिन यह मेरी मदद नहीं करता है।

संपादित करें: जब मैं लाइन

this->setWindowFlags(Qt::Tool); 

सब कुछ ठीक काम किया टिप्पणी की, लेकिन मैं उपकरण-ध्वज में की जरूरत है। कोई विचार?

संपादित करें:

  • ओएस: लिनक्स
  • प्रोग्रामिंग भाषा: C++
  • क्यूटी संस्करण: 4.5.1

उत्तर

13

विंडोज प्रबंधक

तय करता है कि इससे पहले कि मैं शुरू: जैसा कि elcuco और Javier से कहा, एक बड़ा करने के लिए नीति और खिड़कियों लेआउट के अन्य पहलुओं (जैसे शीर्षक पट्टी) अंतर्गत आता है ध्यान केंद्रित संबंधित खिड़कियों का विस्तार प्रबंधक, और क्यूटी का सीमित नियंत्रण हो सकता है। इसे देखने के लिए, बस एक उपयोगकर्ता इंटरफ़ेस देखें जिसमें "focus follows mouse" नीति है। इन मामलों में, विंडोज मैनेजर क्यूटी के फोकस अनुरोध को अनदेखा कर सकता है। इस कारण से, क्यूटी दस्तावेज कई संबंधित झंडे "संकेत" कहते हैं। नतीजतन, कुछ सुझाए गए समाधान आपके लिए काम कर सकते हैं या नहीं भी।

QApplication :: setActiveWindow()

यह बर्दाश्त नहीं, e.tadeu's समाधान दोनों Windows और Ubuntu Gnome के साथ के लिए मेरे लिए QApplication::setActiveWindow() काम करता है का उपयोग करें। मैंने इसे निम्नलिखित कोड के साथ परीक्षण किया। क्षमा करें कि यह PyQt का उपयोग कर पायथन है (मैं पीईक्यूटी के बारे में कुछ सीखने के लिए इन तरह के सवालों का उपयोग करता हूं)। इसे पढ़ने और इसे 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_() 

नोट आप, testWindow के पास घटना के कुछ से निपटने जोड़ने के लिए यदि आप एक Qt::Tool विंडो को बंद क्योंकि एप्लिकेशन स्वचालित रूप से बाहर नहीं है।

grabKeyboard() हैक

यदि यह आप के लिए काम नहीं करता है निम्नलिखित हैक हो सकता है। मुझे लगता है कि आपके पास आपके एप्लिकेशन में एक विंडो है जो सक्रिय है। इनपुट को पुनर्निर्देशित करने के लिए आप grabKeyboard() का उपयोग कर सकते हैं। Qt::Tool विंडो फोकस नहीं पाती है, लेकिन इनपुट प्राप्त करती है। निम्नलिखित मुख्य कोड इसे प्रदर्शित करता है (दूसरा कोड अपरिवर्तित बनी हुई है)।

#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_() 

मूल रूप से, जबकि खिड़की testWindow2 सक्रिय एक है, सभी पाठ testWindow.textEdit में दिखाई देता है में प्रवेश किया। यह अच्छा

अपनी खुद की खिड़की लेआउट बाहर चल द्वारा अपनी खुद की खिड़की

आप सबसे अधिक लचीलापन हासिल (और अपने आप के लिए सबसे अधिक काम बनाने) बनाना नहीं है, मुझे पता है ...। विचार निम्नलिखित FAQ में वर्णित है।

अन्य "समाधान"

आप सीधे (पहली जगह में क्यूटी प्रयोग करने के लिए बहुत कारण के खिलाफ स्पष्ट रूप से) वांछित परिणाम प्राप्त करने के लिए संबंधित विंडो प्रबंधक के एपीआई समारोह कह सकते हैं। आप क्यूटी स्रोत कोड भी हैक कर सकते हैं।उदाहरण के लिए, यदि आप Qt::Tool ध्वज सेट करते हैं, तो WS_EX_TOOLWINDOW के साथ विंडो दिखाने के लिए, SW_SHOWNOACTIVATE ध्वज के साथ ShowWindow() फ़ंक्शन का उपयोग करते हुए Qt ShowWindow() फ़ंक्शन का उपयोग करता है। आप जो चाहें SW_SHOWNOACTIVATE को आसानी से बदल सकते हैं। लिनक्स एक जैसा होना चाहिए। स्पष्ट रूप से भी अनुशंसित नहीं है।

1

कौन सा ऑपरेटिंग सिस्टम? कौन सा क्यूटी 4?

लिनक्स पर आप बर्बाद हो जाते हैं, विंडो प्रबंधक जो आप उसे बता रहे हैं उसे अनदेखा कर सकते हैं। इसे ध्यान में रखें।

+0

पोस्ट करने के लिए जोड़ा गया जानकारी। – Ockonal

0

क्या वही बात होती है यदि आप इसे QMainWindow के बजाय नियमित QWidget बनाते हैं?

इसके अलावा, शायद आप जो भी प्रभाव चाहते हैं उसे हासिल करने की बेहतर कोशिश कर सकते हैं Qt :: टूल अन्य माध्यमों के लिए यदि संभव हो तो? QApplication :: setActiveWindow उपयोग करने के लिए

4

मूल सेब ह्यूमन इंटरफ़ेस दिशानिर्देश (*) ने कहा कि टूलबॉक्स खिड़कियों थे "हमेशा शीर्ष लेकिन कभी सक्रिय"। यह उन पर टेक्स्ट बॉक्स का उपयोग करने की भी सलाह देता है, ठीक है क्योंकि सक्रियण-राज्य प्रतिक्रिया की कमी।

जांचें कि अन्य 'टूलबॉक्स भारी' ऐप्स कैसे व्यवहार करते हैं। मुझे बेहोश याद है कि कम से कम जीआईएमपी और इंकस्केप इस पहलू में बहुत अलग दिखते हैं।

elcuco के अनुसार, खिड़की प्रबंधक क्यूटी के झंडे के साथ जो कुछ भी चाहता है वह कर सकता है। इसके अलावा, यह निश्चित रूप से केडीई, जीनोम, फ्लक्सबॉक्स, जो भी हो, के तहत अलग होगा।

(*): महान दस्तावेज़! कुछ हद तक पुराना; लेकिन टूल विण्डो पहले से ही इस्तेमाल किया है और माना जाता

0

क्यूटी :: उपकरण WindowFlags के बारे में क्यूटी प्रलेखन

इंगित करता है कि विजेट एक उपकरण खिड़की है के शब्दों में किया गया। एक टूल विंडो अक्सर एक छोटी विंडो होती है जो सामान्य शीर्षक बार और सजावट से छोटी होती है, आमतौर पर टूल बटन के संग्रह के लिए उपयोग की जाती है। यह एक अभिभावक है, टूल विंडो हमेशा इसके शीर्ष पर रखी जाएगी।यदि माता-पिता नहीं है, तो आप Qt :: WindowStaysOnTopHint का उपयोग करने पर भी विचार कर सकते हैं। यदि विंडो सिस्टम इसका समर्थन करता है, तो टूल विंडो को कुछ हद तक हल्का फ्रेम से सजाया जा सकता है। यह भी जा क्यूटी :: FramelessWindowHint

के साथ संयुक्त कर सकते हैं यह झंडे लगता है एक समस्या है और क्यूटी :: WindowStaysOnTopHint का उपयोग कर अपनी समस्या को हल करना चाहिए।

0

setWindowFlags() के बाद बस show() पर कॉल करें।

संबंधित मुद्दे