2009-05-20 7 views
7

मैं नहीं एक संवाद खिड़की के रूप में, लेकिन एक विजेट जो मैं एक लेआउट में सम्मिलित कर सकता है के रूप में QColorDialog उपयोग करना चाहते हैं। (अधिक विशेष रूप से एक संदर्भ मेनू में एक कस्टम उप मेनू के रूप में)मैं किसी अन्य विजेट के अंदर QColorDialog का उपयोग कैसे एक अलग संवाद के रूप में नहीं कर सकता?

मैं QColorDialog sourcecode में देखा है, और मैं शायद QColorDialog की आंतरिक कार्यान्वयन इस लक्ष्य को हासिल करने के लिए का एक हिस्सा भर में नकल कर सकता है, लेकिन वहाँ के लिए एक क्लीनर तरीका है यह करो? मैं क्यूटी 4.5.1 ... उपयोग कर रहा हूँ

उत्तर

0

यदि इस सफाई से करने के लिए एक रास्ता है, मैं इसके बारे में पता नहीं कर रहा हूँ। मैं इसे देखना रूप में, आप विकल्पों में से एक जोड़ी है:

  • यह उपवर्ग और कोड है कि वास्तव में विजेट का निर्माण, संपादन करने से बात यह है कि संवाद विंडो बनाता है को हटाने और कुछ अन्य कंटेनर से बदलने के लिए नकल।
  • तुम मर-सेट कि विशेष रूप से संवाद का उपयोग नहीं कर रहे हैं, क्यूटी समाधान से रंग त्रिकोण विजेट काम हो सकता है, क्योंकि यह एक संवाद विंडो नहीं है। आप इसे http पर पा सकते हैं: // doc.trolltech.com/solutions/4/qtcolortriangle/qtcolortriangle.html
+0

यह संभव है। नीचे @ विज़ का समाधान देखें। – metal

2

उपवर्गीकरण प्रयास करें आप कुछ क्यूटी समाधान है, जो आप क्या चाहते हैं के कम से कम हिस्सा हो जाएगा को देखने के लिए चाहते हो सकता है। उदाहरण के लिए, Color Picker समाधान, जो वे ध्यान दें अब एक LGPL लाइसेंस प्राप्त पुस्तकालय के रूप में भी उपलब्ध है।

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

+0

यह समाधान नहीं रह पाया जाता है। क्या कोई अद्यतन उत्पाद लिंक है? – metal

0

उपयोग QGraphicsView (लिंक से खाली स्थान हटाएं) है और यह करने के लिए QDialog जोड़ें। और यदि आप संवाद दिखाना चाहते हैं तो विजेट में QGraphicsView जोड़ें।

2

आप सही खिड़की झंडे की स्थापना करके यह एक बहुत ही सरल तरीके से साफ कर सकते हैं।

QColorDialog8 colorDialog = new .... 
colorDialog->setWindowFlags(Qt::SubWindow); 
15

QColorDialog एक संवाद है जिसका अर्थ है कि यह एक विजेट है। आपको बस कुछ खिड़की झंडे सेट करना है और अपनी इच्छा के अनुसार इसे अपने लेआउट में छोड़ देना है। यहाँ एक (परीक्षण किया) उदाहरण है:

#include <QApplication> 
#include <QMainWindow> 
#include <QColorDialog> 

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

    /* setup a quick and dirty window */ 
    QMainWindow app; 
    app.setGeometry(250, 250, 600, 400); 

    QColorDialog *colorDialog = new QColorDialog(&app); 
    /* set it as our widiget, you can add it to a layout or something */ 
    app.setCentralWidget(colorDialog); 
    /* define it as a Qt::Widget (SubWindow would also work) instead of a dialog */ 
    colorDialog->setWindowFlags(Qt::Widget); 
    /* a few options that we must set for it to work nicely */ 
    colorDialog->setOptions(
       /* do not use native dialog */ 
       QColorDialog::DontUseNativeDialog 
       /* you don't need to set it, but if you don't set this 
        the "OK" and "Cancel" buttons will show up, I don't 
        think you'd want that. */ 
       | QColorDialog::NoButtons 
    ); 

    app.show(); 
    return a.exec(); 
} 
+1

मेरे लिए एक आकर्षण की तरह काम किया। मेनू में काम करने के बारे में कुछ और संकेतों के लिए नीचे मेरा उत्तर देखें। – metal

0

बिल्डिंग @ जानकार के जवाब पर, मैं मेरा कुछ सी ++ 11 विशेषताएं (lambdas और ऑटो का उपयोग कर एक उपकरण पट्टी बटन के बंद एक पॉपअप मेनू बनाया; VS2010 और जीसीसी 4.6 के साथ काम करता क्यूटी 5.1.1) के साथ:

void MyQAction::setPopupDialog(QDialog* dialog) { 

    QWidgetAction* action = new QWidgetAction(NULL); 
    action->setDefaultWidget(dialog); 

    QMenu* menu = new QMenu(); 
    menu->addAction(action); 
    // Fix issues related to the way the dialogbox hide/show. Restablish proper handling, 
    // based on our requirement. 
    connect(menu, SIGNAL(aboutToShow()), dialog, SLOT(show())); 
    connect(dialog, SIGNAL(finished(int)), menu, SLOT(hide())); 

    setMenu(menu); 
} 

इस के लिए प्रक्रिया को स्वचालित करेगा:

auto dialog = new QColorDialog(); 
dialog->setWindowFlags(Qt::Widget); 
dialog->setOptions(QColorDialog::DontUseNativeDialog | QColorDialog::ShowAlphaChannel); 

auto action = new QWidgetAction(0); 
action->setDefaultWidget(dialog); 

auto menu = new QMenu(); 
menu->addAction(action); 

// The dialog-as-widget closes on Ok/cancel, but the menu that holds it 
// doesn't. We connect the two here. Because the dialog hides itself, 
// we need to reshow it when the menu is coming up again. 
connect(menu, &QMenu::aboutToShow,  [=] { dialog->show(); }); 
connect(dialog, &QColorDialog::rejected, [=] { menu->hide(); }); 
connect(dialog, &QColorDialog::colorSelected, 
    [=](const QColor& color) 
    { 
     menu->hide(); 
     OnFillColorChanged(color); // Call the "slot" in this class 
    }); 

auto button = new QToolButton(); 
button->setIcon(QIcon(":/images/whatev.png")); 
button->setText(tr("Fill")); 
button->setStatusTip(tr("Choose fill color")); 
button->setMenu(menu); 
button->setPopupMode(QToolButton::InstantPopup); 
button->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); 

toolbar->addWidget(button); // toolbar is defined elsewhere 
+0

बस एक नोट है कि आपका संशोधित कोड अब Qt4 नहीं है क्योंकि इस प्रश्न को टैग किया गया है। – Wiz

+0

दाएं। स्लॉट्स के लिए लैम्बडास का उपयोग करने के लिए 'कनेक्ट()' कॉल के अलावा थोड़ा अलग वाक्यविन्यास की आवश्यकता होती है, क्या आप किसी अन्य असंगतताओं को देखते हैं? – metal

0

"धातु" से पिछले जवाब के आधार पर मैं तुम्हें QAction की एक व्युत्पन्न वर्ग में निम्न विधि बनाने के लिए सुझाव देते हैं कोई संवाद बॉक्स

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

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