我怎么能在另一个小部件中使用QColorDialog而不是单独的对话框?

时间:2009-05-20 15:31:30

标签: user-interface qt qt4 color-picker

我想将QColorDialog用作对话窗口,而不是用作可以插入布局的小部件。 (更具体地说,作为上下文菜单中的自定义子菜单)

我查看了QColorDialog源代码,我可能会复制QColorDialog的一部分内部实现来实现这一目标,但是有更简洁的方法吗?我正在使用Qt 4.5.1 ......

8 个答案:

答案 0 :(得分:17)

QColorDialog是一个对话框,意味着IT是一个小部件。您需要做的就是设置一些窗口标志,并根据需要将其放入您的布局中。这是一个(测试的)例子:

#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 :(得分:2)

您可能希望查看一些Qt解决方案,它至少可以完成您想要的部分工作。例如,请参阅Color Picker解决方案,他们注意到该解决方案现在也可以作为LGPL许可的库使用。

作为一种替代方法(可能支持度较低),我回想起Qt-Labs中关于将Qt小部件(包括QDialog)嵌入到QGraphicsScene中的一些工作。您可能会这样做,然后更改图形场景上的视图,以便用户只能看到您感兴趣的颜色选择器对话框部分。然而,这听起来很神圣。

答案 2 :(得分:2)

您可以通过设置正确的窗口标志以非常简单的方式清理它。

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

答案 3 :(得分:0)

尝试继承QColorDialog

答案 4 :(得分:0)

使用QGraphicsView并为其添加QDialog。如果要显示对话框,请将QGraphicsView添加到窗口小部件。

答案 5 :(得分:0)

基于@ Wiz的回答,我使用一些C ++ 11功能(Lambdas和auto;使用VS2010和gcc 4.6和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

答案 6 :(得分:0)

基于&#34; metal&#34;之前的回答我建议你在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);
}

这将自动执行任何对话框的过程。

答案 7 :(得分:-1)

如果有办法干净利落地做到这一点,我就不知道了。在我看来,你有几个选择:

  • 对其进行子类化并复制实际构建窗口小部件的代码,进行编辑以删除创建对话窗口的部分并将其替换为其他容器。
  • 如果您没有使用该特定对话框,则qt解决方案中的颜色三角形小部件可能会起作用,因为它不是对话框窗口。您可以在http:// doc.trolltech.com/solutions/4/qtcolortriangle/qtcolortriangle.html找到它(从链接中删除空格)