2009-05-20 6 views
7

Je voudrais utiliser QColorDialog non pas comme une fenêtre de dialogue mais comme un widget que je pourrais insérer dans une mise en page. (Plus spécifiquement sous la forme d'un sous-menu personnalisé dans un menu contextuel)Comment utiliser le QColorDialog dans un autre widget pas comme un dialogue séparé?

J'ai regardé le code source QColorDialog, et je pourrais probablement copier une partie de l'implémentation interne de QColorDialog pour y parvenir, mais y a-t-il une façon plus propre de fais ça? J'utilise Qt ... 4.5.1

Répondre

0

S'il y a un moyen de le faire proprement, je ne suis pas au courant. Comme je le vois, vous avez deux options:

  • et copiez-classe le code qui construit réellement le widget, effectuer des modifications pour supprimer la partie qui crée la fenêtre de dialogue et de le remplacer par un autre récipient.
  • Si vous n'êtes pas prêt à utiliser cette boîte de dialogue particulière, le widget triangle couleur des solutions qt peut fonctionner car il ne s'agit pas d'une boîte de dialogue. Vous pouvez le trouver à l'adresse http: // doc.trolltech.com/solutions/4/qtcolortriangle/qtcolortriangle.html (supprimer l'espace du lien)
+0

C'est possible. Voir la solution @ Wiz ci-dessous. – metal

0

Essayez QColorDialog le sous-classement

2

Vous pouvez regarder des solutions Qt, qui fera au moins une partie de ce que vous voulez. Par exemple, voir la solution Color Picker, qui, selon eux, est maintenant disponible en tant que bibliothèque sous licence LGPL également. Comme une approche alternative (et probablement moins soutenue), je me souviens de certains travaux dans le Qt-Labs sur l'intégration des widgets Qt, y compris QDialog s, dans un QGraphicsScene. Vous pouvez potentiellement le faire, puis modifier la vue sur votre scène graphique afin que seule la partie de la boîte de dialogue de sélection de couleur qui vous intéresse soit visible par l'utilisateur. Cela semble très hackish, cependant.

+0

Cette solution n'est plus trouvée. Y a-t-il un lien de produit mis à jour? – metal

0

Utilisez QGraphicsView et ajoutez QDialog à lui. Et ajoutez QGraphicsView au widget si vous souhaitez afficher la boîte de dialogue.

2

Vous pouvez le faire nettoyer d'une manière très simple en définissant des indicateurs de fenêtre droite.

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

QColorDialog est une boîte de dialogue qui signifie que C'EST un widget. Tout ce que vous devez faire est de définir quelques indicateurs de fenêtre et déposez-le dans votre mise en page comme vous le souhaitez. Voici un (testé) par exemple:

#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

A travaillé comme un charme pour moi. Voir ma réponse ci-dessous pour quelques conseils supplémentaires sur le faire fonctionner dans un menu. – metal

0

bâtiment sur @ réponse de Wiz, j'ai fait la mienne un menu déroulant hors d'un bouton de la barre d'outils en utilisant des 11 fonctionnalités C++ (lambdas et automobiles, travaille avec VS2010 et gcc 4.6 avec 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

Juste une note que votre code modifié n'est plus Qt4 que cette question est étiquetée. – Wiz

+0

Droite. Outre les appels 'connect()' qui nécessitent une syntaxe légèrement différente pour utiliser les lambdas pour les slots, remarquez-vous d'autres incompatibilités? – metal

0

base sur la réponse précédente de « métal » je vous suggère de créer la méthode suivante dans une classe dérivée de 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); 
} 

ce automatisera le processus de n'importe quelle boîte de dialogue.