2009-05-20 7 views
7

Vorrei usare QColorDialog non come una finestra di dialogo ma come un widget che potrei inserire in un layout. (Più specificamente come sottomenu personalizzato in un menu di scelta rapida)Come posso usare QColorDialog all'interno di un altro widget non come una finestra di dialogo separata?

Ho esaminato il codice sorgente QColorDialog e probabilmente avrei potuto copiare una parte dell'implementazione interna di QColorDialog per ottenere ciò, ma c'è un modo più pulito per Fai questo? Sto usando Qt 4.5.1 ...

risposta

0

Se c'è un modo per farlo in modo pulito, non ne sono a conoscenza. Come la vedo io, si dispone di un paio di opzioni:

  • sottoclasse e copiare il codice che costruisce in realtà il widget, apportando modifiche per rimuovere la parte che crea la finestra di dialogo e sostituirlo con qualche altro contenitore.
  • Se non si utilizza la finestra di dialogo in questione, il widget del triangolo dei colori delle soluzioni qt potrebbe funzionare, perché non è una finestra di dialogo. Lo si può trovare all'indirizzo http: // doc.trolltech.com/solutions/4/qtcolortriangle/qtcolortriangle.html (rimuovere lo spazio dal link)
+0

È possibile. Vedi la soluzione di @ Wiz di seguito. – metal

0

Prova sottoclasse QColorDialog

2

si potrebbe desiderare di guardare alcune soluzioni Qt, che farà almeno una parte di ciò che si desidera. Ad esempio, vedere la soluzione Color Picker, che si nota è ora disponibile anche come libreria con licenza LGPL.

Come approccio alternativo (e probabilmente meno supportato), ricordo alcuni lavori in Qt-Lab sull'inclusione di widget Qt, incluso QDialog s, in un QGraphicsScene. Potresti potenzialmente farlo, quindi modificare la vista sulla scena grafica in modo che solo la parte della finestra di selezione del colore a cui sei interessato fosse visibile all'utente. Sembra molto hacker, comunque.

+0

Questa soluzione non è più disponibile. C'è un link prodotto aggiornato? – metal

0

Usa QGraphicsView e aggiungere QDialog ad esso. E aggiungi QGraphicsView al widget se vuoi mostrare la finestra di dialogo.

2

È possibile eseguire la pulizia in un modo molto semplice impostando le finestre di destra.

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

QColorDialog è una finestra di dialogo che significa che IT È un widget. Tutto quello che devi fare è impostare alcuni flag di finestra e rilasciarli nel layout come desideri. Ecco una (testato) Esempio:

#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

Ha funzionato come un incantesimo per me. Vedere la mia risposta di seguito per ulteriori suggerimenti su come farlo funzionare in un menu. – metal

0

Sulla @ risposta di Wiz, il mio si fece un menu a comparsa fuori di un pulsante della barra degli strumenti utilizzando alcuni C++ 11 caratteristiche (lambda e auto; funziona con VS2010 e gcc 4.6 con Qt 5.1.1):

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

Solo una nota che il codice modificato non è più Qt4 in quanto questa domanda è contrassegnata con. – Wiz

+0

Giusto. Oltre alle chiamate 'connect()' che richiedono una sintassi leggermente diversa per usare lambdas per gli slot, noti altre incompatibilità? – metal

0

base alla risposta precedente da "metal" vi suggerisco di creare il seguente metodo in una classe derivata di QAction:

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); 
} 

questo consente di automatizzare il processo di qualsiasi finestra di dialogo.

Problemi correlati