9

QColorDialogをダイアログウィンドウとしてではなく、レイアウトに挿入できるウィジェットとして使用したいと思います。(より具体的には、コンテキストメニューのカスタムサブメニューとして)

QColorDialogソースコードを調べたところ、おそらくQColorDialogの内部実装の一部をコピーしてこれを実現できましたが、これを行うためのよりクリーンな方法はありますか?Qt4.5.1を使用しています...

4

8 に答える 8

17

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();
}
于 2013-01-26T17:49:05.753 に答える
3

正しいウィンドウフラグを設定することで、非常に簡単な方法できれいにすることができます。

QColorDialog8 colorDialog = new ....
colorDialog->setWindowFlags(Qt::SubWindow);
于 2012-03-01T17:34:16.500 に答える
2

あなたが望むことの少なくとも一部を行ういくつかの Qt ソリューションを見たいと思うかもしれません。たとえば、Color Pickerソリューションを参照してください。これは、LGPL ライセンスのライブラリとしても利用できるようになりました。

別の (そしておそらくあまりサポートされていない) アプローチとして、Qt-Labs でQDialogの s を含む Qt ウィジェットのQGraphicsScene. 可能であれば、グラフィック シーンのビューを変更して、関心のあるカラー ピッカー ダイアログの部分だけがユーザーに表示されるようにします。ただし、非常にハックに聞こえます。

于 2009-05-20T16:20:28.013 に答える
0

QColorDialogをサブクラス化してみてください

于 2009-05-20T16:16:05.900 に答える
0

@Wizの回答に基づいて、いくつかのC ++ 11機能(ラムダと自動; Qt 5.1.1でVS2010およびgcc 4.6で動作)を使用して、ツールバーボタンからポップアップメニューを作成しました:

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
于 2013-10-22T17:18:16.847 に答える
0

使用QGraphicsViewして追加QDialogします。QGraphicsViewダイアログを表示したい場合は、ウィジェットに追加します。

于 2009-12-17T16:25:59.933 に答える
-1

これをきれいに行う方法がある場合、私はそれを認識していません。ご覧のとおり、いくつかのオプションがあります。

  • それをサブクラス化し、実際にウィジェットを構築するコードをコピーし、編集を行ってダイアログ ウィンドウを作成する部分を削除し、それを他のコンテナーに置き換えます。
  • その特定のダイアログの使用に固執していない場合は、ダイアログ ウィンドウではないため、qt ソリューションのカラー トライアングル ウィジェットが機能する可能性があります。http://doc.trolltech.com/solutions/4/qtcolortriangle/qtcolortriangle.html で見つけることができます (リンクからスペースを削除してください)。
于 2009-05-20T16:23:59.270 に答える