2013-08-27 12 views
7

में किसी एप्लिकेशन को एम्बेड करने के लिए कैसे करें हमारे प्रोजेक्ट में हमारे पास तीन स्वतंत्र एप्लिकेशन हैं, और हमें इन तीन अनुप्रयोगों को नियंत्रित करने वाले क्यूटी नियंत्रण एप्लिकेशन को विकसित करना होगा। मुख्य खिड़की तीन उप खिड़कियों से अलग हो जाएगी - प्रत्येक एक और एक एप्लीकेशन प्रदर्शित करेगा।
मैं QX11EmbedWidget और QX11EmbedContainer विगेट्स, लेकिन उस के साथ दो समस्याओं का उपयोग करने के बारे में सोचा:क्यूटी क्यूटी विजेट

  1. QX11Embed * X11 प्रोटोकॉल पर आधारित है और अगर यह विंडोज ओएस जैसी गैर-X11 सिस्टम पर समर्थित है मैं नहीं जानता।
  2. क्यूटी 5 के बाद से ये कक्षाएं मौजूद नहीं हैं, और क्यूटी दस्तावेज का उल्लेख क्यों नहीं है।

ताकि मुझे नहीं पता कि इसका उपयोग करना है या नहीं - मुझे जवाब प्राप्त करने में खुशी होगी।
इसके अलावा, मुझे लगता है कि क्यूटी 5.1 में QWidget::createWindowContainer(); फ़ंक्शन है कि कुछ पोस्टों में ऐसा लगता है कि यह X11Embed के प्रतिस्थापन होना चाहिए। क्या कोई मुझे बता सकता है कि मैं इस फ़ंक्शन का उपयोग क्यूटी विजेट बनाने के लिए कैसे कर सकता हूं जो इसके अंदर एक और एप्लिकेशन (उदाहरण के लिए कैलकुलेटर) चलाएगा?

मैंने Google में बहुत कुछ खोजा है, और मेरे प्रश्नों के उत्तर नहीं मिला।
क्या कोई मेरी मदद कर सकता है? क्या मैं सही रास्ते पर हूं?
धन्यवाद!

उत्तर

8

यदि सभी तीन स्वतंत्र अनुप्रयोग क्यूटी के साथ लिखे गए हैं, और आपके पास उनका स्रोत है, तो आप क्यूटी में जीयूआई वस्तुओं के parenting के माध्यम से उन्हें एकजुट करने में सक्षम होना चाहिए।

http://qt-project.org/doc/qt-4.8/objecttrees.html

http://qt-project.org/doc/qt-4.8/widgets-and-layouts.html

http://qt-project.org/doc/qt-4.8/mainwindows-mdi.html

आपको लगता है कि रास्ते में उन तक पहुंच नहीं है, तो क्या आप के बारे में बात कर रहे 3 पार्टी विंडो प्रबंधन की तरह है। यह विंडोज एक्सप्लोरर की तरह एक खोल लिखने जैसा है, जो राज्य और अन्य विंडो अनुप्रयोगों के आकार में हेरफेर करता है।

विंडोज़ के लिए जासूस ++ या ऑटोआईट जासूस जैसे प्रोग्राम और अन्य ओएस के लिए समान प्रोग्राम का उपयोग करें, और अपनी खिड़कियों की पहचान करने वाले चिह्नों को सीखें जिन्हें आप नियंत्रित करना चाहते हैं, जैसे वर्ग, विंडो शीर्षक आदि।या आप खुद को QProcess::startDetached() चीज़ में exe लॉन्च कर सकते हैं।

http://qt-project.org/doc/qt-5.1/qtcore/qprocess.html#startDetached

उसके बाद OS निर्भर कॉल खिड़कियों पर नियंत्रण का उपयोग कर। क्यूटी लाइब्रेरी में यह सामान तीसरे पक्ष की खिड़कियों के लिए नहीं बनाया गया है, केवल आपके द्वारा लॉन्च किए गए QAplication के तहत। ऑटोहॉटकी, या एएचके द्वारा इस तरह की चीजों को करने के कई उदाहरण हैं। यह एक स्क्रिप्टिंग भाषा है जो विंडोज वातावरण में बहुत सी चीजों को स्वचालित करने के लिए बनाई गई है, और मैक के लिए पोर्ट भी है (हालांकि मैंने मैक पोर्ट को स्वयं नहीं देखा है)।

तो अंत में आप इस तरह एक फोन के साथ शायद अपनी खिड़की खोजने पर देख रहे हैं:

#include <windows.h> 

HWND hwnd_1 = ::FindWindow("Window_Class", "Window Name"); 
LONG retVal = GetWindowLongA(hwnd_1, GWL_STYLE); // to query the state of the window 

फिर तो जैसे स्थिति और खिड़की के राज्य में हेरफेर:

::MoveWindow(hwnd_1, x, y, width, height, TRUE); 
::ShowWindow(hwnd_1, SW_SHOWMAXIMIZED); 

आप कर सकते हैं यहां तक ​​कि उन विंडो के शीर्ष पर विजेट भी खींचें जिन्हें आप नियंत्रित कर रहे हैं यदि आप खिड़कियों के लिए अपनी खिड़की झंडे को सही तरीके से सेट करते हैं।

transparent QLabel with a pixmap

Cannot get QSystemTrayIcon to work correctly with activation reason

कुछ gotchas है कि जब यह सब करने के लिए Windows में आने, विंडोज यूआई की विचित्रता जानने है, जब वे प्रदर्शन आप क्या उम्मीद से अलग स्केलिंग निर्धारित करते हैं, और अगर आप टास्क बार के साथ अच्छा खेलना चाहते हैं, और अपने प्रोग्राम की सभी मोडल विंडो को संभालना चाहते हैं जो आप जोड़ रहे हैं।

तो कुल मिलाकर, यह सक्षम है। क्यूटी इन आदेशों को करने के लिए एक अच्छा इंटरफ़ेस बनाएगा, लेकिन अंत में आप इसे एक सुंदर, भरोसेमंद, विंडो प्रबंधक में लाने के लिए बहुत सारे काम और डिबगिंग देख रहे हैं।

आशा है कि मदद करता है।

+1

सबसे पहले धन्यवाद, मुझे जवाब दें, मुझे लगता है कि कोई भी मुझे जवाब दे सकता है। मुझे स्रोत कोड तक पहुंच नहीं है। 2 प्रश्न: QWidget :: createWindowContainer() के बारे में आप क्या जानते हैं; समारोह, क्या यह सब काम कर सकता है? 2. यदि आपके समाधान के लिए खिड़कियों के लिए बहुत सारे पोर्टिंग की आवश्यकता है - शायद यह लायक नहीं है - एक छोटा सा समाधान विंडोज़ के लिए .NET में ऐप लिखना है और मुझे लिनक्स-उबंटू के बारे में पता नहीं है? – RRR

+0

मैंने पहले 'createWindowContainer' का उपयोग नहीं किया है। ऐसा लगता है कि यह किसी भी प्रकार के 'क्यूविंडो' को अपग्रेड करने के लिए एक शॉर्टकट है, जैसे कि दृश्यग्राफ या क्यूटी क्विक या ओपनजीएल विंडो, जिसमें एक पूर्ण खिड़की सजावट है जो अन्य QWidgets के साथ काम करती है। ऐसा लगता है कि यह किसी भी एचडब्ल्यूएनडी आईडी को नहीं ले सकता है ... http://blog.qt.digia.com/blog/2013/02/19/introducing-qwidgetcreatewindowcontainer/ – phyatt

+0

विंडोज़ हैंडलिंग करना बहुत मुश्किल नहीं है। यह अनुसंधान और काम करता है, लेकिन विंडोज़ में उठने और उन्हें छेड़छाड़ करने में कुछ घंटों से ज्यादा समय नहीं लगना चाहिए। मैंने इसे अभी तक लिनक्स और ओएसएक्स में नहीं किया है, लेकिन यह सिर्फ सही कॉल करने की बात होनी चाहिए। – phyatt

6

मैं इसे कभी नहीं अपने आप को कोशिश की, लेकिन क्यूटी 5.1 में डॉक्स से मैं कोशिश करेगा QWindow :: fromId (wid आईडी) है, जो आप एक QWindow, जो createWindowContainer साथ एम्बेड किए जाने चाहिए देता है:

QWindow * QWindow :: सेWinId (WId आईडी) [स्थिर] एक स्थानीय प्रक्रिया किसी अन्य प्रक्रिया द्वारा बनाई गई विंडो का प्रतिनिधित्व या क्यूटी के नीचे मूल पुस्तकालयों का उपयोग करके बनाता है।

एक देशी खिड़की को संभाल आईडी को देखते हुए, इस विधि एक QWindow वस्तु जो जब setParent() और setTransientParent() की तरह के तरीकों लागू खिड़की का प्रतिनिधित्व करने के लिए किया जा सकता पैदा करता है। इसका उपयोग प्लेटफार्मों पर किया जा सकता है जो एक कंटेनर के अंदर एक विंडो को एम्बेड करने के लिए या पर किसी अन्य प्रक्रिया द्वारा बनाई गई विंडो के शीर्ष पर एक विंडो स्टिक बनाते हैं।

लेकिन कोई गारंटी नहीं। :-)

+0

हम हैंडल आईडी को बाहरी एप्लिकेशन (QProcess के माध्यम से बनाया गया) में वास्तव में कैसे प्राप्त कर सकते हैं? – user3079474

+0

छोटी गाड़ी! https://bugreports.qt.io/browse/QTBUG-40320 :) – mlvljr

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