QColorDialogをダイアログウィンドウとしてではなく、レイアウトに挿入できるウィジェットとして使用したいと思います。(より具体的には、コンテキストメニューのカスタムサブメニューとして)
QColorDialogソースコードを調べたところ、おそらくQColorDialogの内部実装の一部をコピーしてこれを実現できましたが、これを行うためのよりクリーンな方法はありますか?Qt4.5.1を使用しています...
QColorDialogをダイアログウィンドウとしてではなく、レイアウトに挿入できるウィジェットとして使用したいと思います。(より具体的には、コンテキストメニューのカスタムサブメニューとして)
QColorDialogソースコードを調べたところ、おそらくQColorDialogの内部実装の一部をコピーしてこれを実現できましたが、これを行うためのよりクリーンな方法はありますか?Qt4.5.1を使用しています...
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();
}
正しいウィンドウフラグを設定することで、非常に簡単な方法できれいにすることができます。
QColorDialog8 colorDialog = new ....
colorDialog->setWindowFlags(Qt::SubWindow);
あなたが望むことの少なくとも一部を行ういくつかの Qt ソリューションを見たいと思うかもしれません。たとえば、Color Pickerソリューションを参照してください。これは、LGPL ライセンスのライブラリとしても利用できるようになりました。
別の (そしておそらくあまりサポートされていない) アプローチとして、Qt-Labs でQDialog
の s を含む Qt ウィジェットのQGraphicsScene
. 可能であれば、グラフィック シーンのビューを変更して、関心のあるカラー ピッカー ダイアログの部分だけがユーザーに表示されるようにします。ただし、非常にハックに聞こえます。
QColorDialogをサブクラス化してみてください
@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
使用QGraphicsView
して追加QDialog
します。QGraphicsView
ダイアログを表示したい場合は、ウィジェットに追加します。
これをきれいに行う方法がある場合、私はそれを認識していません。ご覧のとおり、いくつかのオプションがあります。