2012-10-22 11 views
26

में QWidget ऑब्जेक्ट एम्बेड करें मैं Qt5 बीटा का उपयोग कर रहा हूं और QWidget- आधारित ऑब्जेक्ट को QML में एम्बेड करने का प्रयास कर रहा हूं। लक्ष्य क्यूएमएल जितना संभव हो उतना उपयोग करना है, और केवल QWidget ऑब्जेक्ट्स का उपयोग करें जहां QML ऐसा नहीं करता जो मुझे चाहिए। मुझे Qt4.7 के लिए यह कैसे करना है, यह बताते हुए एक लिंक मिला, लेकिन मुझे यह जानकारी नहीं मिली है कि Qt5 में इसे कैसे किया जाए।क्यूटी 5। QML

http://doc.qt.digia.com/4.7/declarative-cppextensions-qwidgets.html

एक ही उदाहरण भी Qt5 उदाहरण में उपलब्ध है के तहत फ़ोल्डर:

उदाहरण \ qtquick1 \ कथात्मक \ cppextensions \ qwidgets

दुर्भाग्य से, इस उदाहरण QtQuick 1 का उपयोग करता है, बजाय QtQuick 2, और मैं Qt5 की नई सुविधाओं का उपयोग करना चाहता हूं। मैं वास्तव में एक qwt विजेट एम्बेड करना चाहता हूं, लेकिन पहले चरण के रूप में मुझे किसी भी साधारण QWidget- आधारित ऑब्जेक्ट को एम्बेड करने में खुशी होगी।

क्या कोई मुझे Qt5/QtQuick 2 के तहत काम करने का उदाहरण प्राप्त करने में मदद कर सकता है?

+2

इस बारे में कुछ प्रासंगिक समाचार: [QtQuickWidget] (https://qt.gitorious.org/qt/qtdeclarative/source/b02bed1caae6966925b9efb04e1db79c3e9ef687:src/quickwidgets/qquickwidget.cpp#L169) इस समस्या के पीछे हल करती है; यही है, विगेट्स में क्यूटी त्वरित आइटम एम्बेड करना। यह क्यूटी 5.3 में उपलब्ध होगा। – Mitch

उत्तर

32

क्यूटी क्विक 2 जीपीयू पर कुशल प्रतिपादन के लिए एक दृश्य ग्राफ का उपयोग करता है। दुर्भाग्यवश यह क्लासिक विजेट को दृश्य में एम्बेड करना असंभव बनाता है। QGraphicsProxyWidget की सहायता से ऐसे विजेट एम्बेड करने का पुराना तरीका केवल क्यूटी क्विक 1 के साथ काम करता है, क्योंकि आंतरिक रूप से यह सभी भारी उठाने के लिए QGraphicsView का उपयोग करता है और QGraphicsProxyWidget इसका उपयोग करने के लिए किया जाता है।

अभी तक क्लासिक QWidgets को उस दृश्य ग्राफ में एम्बेड करने में सक्षम करने की कोई योजना नहीं है, जिसे मैं जानता हूं। मुझे लगता है कि यह बदलने की संभावना नहीं है, क्योंकि क्यूपेन्टर की अवधारणाएं, क्लासिक विगेट्स के लिए उपयोग की जाने वाली पेंटिंग फ्रेमवर्क, और नया दृश्य ग्राफ एक-दूसरे के साथ अच्छा नहीं खेलता है।

नए विजेट विकसित करने के कुछ प्रयास विशेष रूप से QML की आवश्यकताओं के अनुरूप बनाए गए हैं, लेकिन इनमें से कोई भी क्लासिक विजेट के रूप में शक्तिशाली और परिपक्व नहीं है। सबसे प्रमुख लोग QML Quick Controls हैं, संस्करण 5.1 के बाद से क्यूटी के साथ बंडल किए गए हैं।

यदि आप वास्तव में क्यूडब्ल्यूटी पर निर्भर करते हैं तो मेरी सलाह अब क्यूटी क्विक 1.1 के साथ रहना होगा। यह अभी भी आपके जैसे मामलों के लिए क्यूटी 5 के साथ बंडल किया गया है। इस तरह आप नए दृश्य ग्राफ का लाभ नहीं उठाएंगे।

+0

आपके बहुत स्पष्ट स्पष्टीकरण के लिए धन्यवाद। मेरी परियोजना अभी भी काफी नई है कि मैं क्यूडब्ल्यूटी के लिए पूरी तरह से प्रतिबद्ध नहीं हूं। – eatyourgreens

+4

अपडेट: शुद्ध क्यूएमएल विजेट्स उर्फ ​​घटकों ने बहुत जवाब दिया है क्योंकि यह उत्तर पोस्ट किया गया था। –

6

क्या किया जा सकता है विजेट को एक छवि में प्रस्तुत करना और बनावट के रूप में अपलोड करना। बातचीत के लिए किसी को माउस की तरह घटनाओं को आगे बढ़ाने की आवश्यकता है या दृश्य से दबाया गया है, अनुच्छेद से अनुवाद, विजेट समन्वय में अनुवाद, पास, प्रस्तुत करना और फिर से बनावट अपलोड करना। बस एक विचार :)

+6

बिल्कुल। लेकिन इस दृष्टिकोण के लिए एक रचनात्मक और साहसी व्यक्ति की आवश्यकता है। – user1095108

6

अनुशंसित दृष्टिकोण QWidget आधारित एप्लिकेशन के साथ रहना और QWidget :: createWindowContainer का उपयोग कर QML भागों को एम्बेड करना है।

2

आप QQuickPaintedItem वर्ग का उपयोग करके QML को QWidget एम्बेड कर सकते हैं: http://doc.qt.io/qt-5/qquickpainteditem.html

Qt5 एक उदाहरण है: http://doc.qt.io/qt-5/qtquick-customitems-painteditem-example.html

आप निजी विजेट विशेषता के साथ QQuickPaintedItem का एक अंतर्निहित को लागू करना चाहिए, कि आप एम्बेड करना चाहते। पेंट विधि प्रदान करें, जो सिर्फ QtWidget प्रस्तुत करें और QTWidget एम्बेड करने के लिए QQuickPaintedItem के उत्तराधिकारी से प्रेषित माउस और अन्य ईवेंट प्रदान करें।

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

मैं QCustomPlot की एम्बेडिंग को क्रियान्वित किया है, यहाँ लिंक है: github.com/mosolovsa/qmlplot

0
जुलिएन के जवाब देने के लिए इसके अलावा

- प्राप्त करने के लिए इस QQuickWidget उपयोग करने के लिए QML दृश्य प्रदर्शित करने के लिए है, और फिर जोड़ने का आसान तरीका QQuickWidget के बच्चे के रूप में एक नियमित QWidget। आप दृश्य में किसी आइटम को QWidget एंकर करने के लिए एक साधारण इंटरमीडिएट QObject भी जोड़ सकते हैं।

उदाहरण के लिए:

main.qml में:

Item { 

    ... // layouts, extra items, what have you 

     Item 
     { 
      objectName: "layoutItem" 
      anchors.fill: parent 
     } 

    ... // more layouts, extra items, etc. 
} 

widgetanchor.h:

class WidgetAnchor: public QObject 
{ 
    ptr<QWidget> _pWidget; 
    QPointer<QQuickItem> _pQuickItem; 
public: 
    WidgetAnchor(QWidget* pWidget, QQuickItem* pItem) 
     : QObject(pWidget), _pWidget(pWidget), _pQuickItem(pItem) 
    { 
     connect(_pQuickItem, &QQuickItem::xChanged, this, &WidgetAnchor::updateGeometry); 
     connect(_pQuickItem, &QQuickItem::yChanged, this, &WidgetAnchor::updateGeometry); 
     connect(_pQuickItem, &QQuickItem::widthChanged, this, &WidgetAnchor::updateGeometry); 
     connect(_pQuickItem, &QQuickItem::heightChanged, this, &WidgetAnchor::updateGeometry); 
     updateGeometry(); 
    } 
private: 
    void updateGeometry() 
    { 
     if (_pQuickItem) 
     { 
      QRectF r = _pQuickItem->mapRectToItem(0, QRectF(_pQuickItem->x(), _pQuickItem->y(), _pQuickItem->width(), _pQuickItem->height())); 
      _pWidget->setGeometry(r.toRect()); 
     } 
    } 
}; 

main.cpp में:

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 

    auto pqw = new QQuickWidget; 
    pqw->setSource(QUrl::fromLocalFile("main.qml")); 
    pqw->setResizeMode(QQuickWidget::SizeRootObjectToView); 
    pqw->setAttribute(Qt::WA_DeleteOnClose); 
    auto pOwt = new MyWidget(pqw); 
    if (auto pOverlayItem = pqw->rootObject()->findChild<QQuickItem*>("overlayItem")) 
     new WidgetAnchor(pOwt, pOverlayItem); 
    pqw->show(); 

    return app.exec(); 
} 

प्रलेखन कहा गया है कि का उपयोग कर QQuickWidget विज्ञापन है इस तरह के आदेश stacking पर कोई प्रतिबंध नहीं के रूप में QQuickView और QWidget :: createWindowContainer, अधिक vantages है, लेकिन एक 'मामूली प्रदर्शन हिट' है।

उम्मीद है कि मदद करता है।

0

Here QML आधारित लेआउट पर QComboBox जोड़ने के बारे में विस्तार से बताया। सोचो कि आपके मामले के लिए अच्छा उदाहरण होगा। (क्यूटी 5.9 में मूल कॉम्बोबॉक्स क्यूएमएल नियंत्रण लागू किया गया)।

+0

नोट इस क्यूटी त्वरित 1, नहीं क्यूटी त्वरित 2 में एम्बेड करने के लिए कैसे बताते हैं कि। – fkorsa