QDockWidgetには、ウィンドウ タイトルと閉じるボタンがあります。タイトルバーにアイコンを配置するにはどうすればよいですか?
QDockWidget WindowIconプロパティのリソースからアイコンを選択しても、機能しません。
何か案は?
QDockWidgetには、ウィンドウ タイトルと閉じるボタンがあります。タイトルバーにアイコンを配置するにはどうすればよいですか?
QDockWidget WindowIconプロパティのリソースからアイコンを選択しても、機能しません。
何か案は?
カスタム プロキシ スタイルを介して:
class iconned_dock_style: public QProxyStyle{
Q_OBJECT
QIcon icon_;
public:
iconned_dock_style(const QIcon& icon, QStyle* style = 0)
: QProxyStyle(style)
, icon_(icon)
{}
virtual ~iconned_dock_style()
{}
virtual void drawControl(ControlElement element, const QStyleOption* option,
QPainter* painter, const QWidget* widget = 0) const
{
if(element == QStyle::CE_DockWidgetTitle)
{
//width of the icon
int width = pixelMetric(QStyle::PM_ToolBarIconSize);
//margin of title from frame
int margin = baseStyle()->pixelMetric(QStyle::PM_DockWidgetTitleMargin);
QPoint icon_point(margin + option->rect.left(), margin + option->rect.center().y() - width/2);
painter->drawPixmap(icon_point, icon_.pixmap(width, width));
const_cast<QStyleOption*>(option)->rect = option->rect.adjusted(width, 0, 0, 0);
}
baseStyle()->drawControl(element, option, painter, widget);
}
};
例:
QDockWidget* w("my title", paretn);
w->setStyle(new iconned_dock_style( QIcon(":/icons/icons/utilities-terminal.png"), w->style()));
@Owen に感謝しますが、Qt 5.7 についていくつかメモを追加したいと思います。
1.QWidget::setStyle()はスタイル オブジェクトの所有権を取得しないため、使用後に削除する必要があります。そうしないと、リソース リークが発生します。
2.QProxyStyle(QStyle*) の場合、QProxyStyle は入力スタイルの所有権を取得しますが、カスタム スタイルが設定されていない場合、w->style() は QApplication のスタイル オブジェクトを返す場合があります。それで
new iconned_dock_style( QIcon(":/icons/icons/utilities-terminal.png"), w->style())
アプリのスタイル オブジェクトの所有権を取得することができ、破棄時にそれを削除します。これにより、QApplicatoin のシャットダウン時にアプリがクラッシュします。
だから今私は使う
new iconned_dock_style( QIcon(":/icons/icons/utilities-terminal.png"), NULL)
QDockWidget::setTitleBarWidget(QWidget *widget)を使用できると思います。