2013-05-14 5 views
1

Я пытаюсь добавить QgraphicsView(QColorDialog) виджет на диалоге Palette, но QGraphicsScene соответствующий QColorDialog виджета всегда пустой, и было бы большим подспорьем, если читатели могли бы помочь мне исправить мою ошибку.Виджеты внутри QGraphicsScene

Qt-4.8.4-Linux (CentOS)

  1. The 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()); 
    } 
    
  2. PaletteDialog Конструктор

    PaletteDialog::PaletteDialog(QWidget *parent) 
        : QDialog(parent), 
        ui(new Ui::PaletteDialog), 
    { 
        //PaletteDialog sets up the ClrWidget 
        ui->setupUi(this); 
        ... 
    } 
    
+0

@Jerry_Coffin, добавьте _dialog виджет на сцене, но где вы установите положение виджета (в сцене), когда он был добавлен? Кроме того, в прошлом я обнаружил, что были проблемы с использованием QGraphicsProxyWidget с некоторыми виджетами. Попробуйте добавить QGraphicsRectItem в сцену и посмотреть, отображается ли это там, где вы ожидаете прокси-прокси. – TheDarkKnight

ответ

4

Попробуйте что-то вроде этого:

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

И удалить эту строку:

proxyWidget->setWidget(_dialog);

То, что вы сделали неправильно был установлен виджет на QGraphicsProxyWidget, а затем называется QGraphicsScene::addWidget(..), который делает то же самое, и что не работает. Вы можете добавить свой QGraphicsProxyWidget в сцену, но позвонив по номеру QGraphicsScene::addItem().

Пример:

setScene(new QGraphicsScene(this)); 
QColorDialog *_dialog = new QColorDialog; 
_dialog->setOption(QColorDialog::NoButtons, true); 
QGraphicsProxyWidget *proxyWidget = new QGraphicsProxyWidget; 
proxyWidget->setWidget(_dialog); 
scene()->addItem(proxyWidget); 
+0

Я попробовал ваше предложение, но это не помогло. Другой запрос: Когда ClrWidget построен модальный диалог с названием «Выбрать цвет», и я не уверен, что это приводит к тому, что сцена Qgraphics становится пустой. – rahul

+0

@rahul Это странно .. это работает для меня. Я немного изменил свой ответ и объяснил, что вы сделали неправильно. Вызов show() на вашем QColorDialog перед добавлением его на сцену должен исправить диалог «Выбрать цвет». – thuga

1

При создании QGraphicsScene, я обычно все виджеты на сцене перед вызовом QGraphicsView::setScene(scene). Вы можете удалить звонок до scene()->setSceneRect() в этом случае, потому что он будет автоматически определяться геометрией виджетов, которые он содержит. Модифицированный код будет выглядеть следующим образом:

ClrWidget::ClrWidget(QWidget *parent) : QGraphicsView(parent) 
{ 
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 
setFrameStyle(QFrame::NoFrame); 

QGraphicsScene *scene=new QGraphicsScene((QRect)geometry,this); 
_dialog = new QColorDialog(); 
_dialog->setOption(QColorDialog::NoButtons, true); 

//here you should call setGeometry unless it is called in the constructor 
_dialog->setGeometry(rect); 
// 

setMinimumSize(_dialog->size()); 
setMaximumSize(_dialog->size()); 

QGraphicsProxyWidget *proxyWidget = scene->addWidget(_dialog); 

setScene(scene); 
} 
+0

Надеюсь, вы поймете, что в этом примере сцена будет уничтожена, как только закончится функция конструктора. Поэтому вам нужно будет использовать QGraphicsScene * scene = new QGraphicsScene; – thuga

+0

, это правильно ... – buster

+0

@buster добавление GraphicsWidgets/Элементы на сцену можно сделать после установки сцены в представление без каких-либо проблем. – TheDarkKnight

Смежные вопросы