QGraphicsScene 中的小部件

rah*_*hul 2 c++ qt qt4

我正在尝试将一个QgraphicsView(QColorDialog)小部件添加到Palette对话框中,但是QGraphicsScene与该小部件相对应的QColorDialog始终是空白,如果读者能够帮助我纠正我的错误,那将会有很大的帮助。

Qt-4.8.4-Linux(CentOS)

  1. GraphicsView将包含在的小部件PalletteDialog

    ClrWidget::ClrWidget(QWidget *parent) :
      QGraphicsView(parent)
    {
      setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
      setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
      setFrameStyle(QFrame::NoFrame);
    
      setScene(new QGraphicsScene(this));
    
      _dialog = new QColorDialog();
      _dialog->setOption(QColorDialog::NoButtons, true);
      setMinimumSize(_dialog->size());
      setMaximumSize(_dialog->size());
    
      QGraphicsProxyWidget *proxyWidget = new QGraphicsProxyWidget();
      proxyWidget->setWidget(_dialog);
      //scene()->addItem(proxyWidget);
      //scene()->setSceneRect(proxyWidget->geometry());
    
      scene()->addWidget(_dialog);
      scene()->setSceneRect(_dialog->geometry());
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. PaletteDialog构造函数

    PaletteDialog::PaletteDialog(QWidget *parent)
      : QDialog(parent),
      ui(new Ui::PaletteDialog),
    {
      //PaletteDialog sets up the ClrWidget
      ui->setupUi(this);
      ...
    }
    
    Run Code Online (Sandbox Code Playgroud)

thu*_*uga 5

尝试这样的事情:

setScene(new QGraphicsScene);
QColorDialog *_dialog = new QColorDialog();
_dialog->setOption(QColorDialog::NoButtons, true);
_dialog->show();
QGraphicsProxyWidget *proxyWidget = scene()->addWidget(_dialog);
Run Code Online (Sandbox Code Playgroud)

并删除这一行:

proxyWidget->setWidget(_dialog);

您做错的是将小部件设置为 QGraphicsProxyWidget,然后调用QGraphicsScene::addWidget(..),它执行相同的操作,但不起作用。您可以通过调用QGraphicsScene::addItem()将 QGraphicsProxyWidget 添加到场景中。

例子:

setScene(new QGraphicsScene(this));
QColorDialog *_dialog = new QColorDialog;
_dialog->setOption(QColorDialog::NoButtons, true);
QGraphicsProxyWidget *proxyWidget = new QGraphicsProxyWidget;
proxyWidget->setWidget(_dialog);
scene()->addItem(proxyWidget);
Run Code Online (Sandbox Code Playgroud)