crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Проблема с QGraphicsView и QGraphicsScene
NordWest
  опции профиля:
сообщение 31.3.2011, 13:40
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 86
Регистрация: 26.11.2008
Пользователь №: 433

Спасибо сказали: 1 раз(а)




Репутация:   0  


Пытаюсь написать диалог с выбором цветов для набора элементов, отображаемых в основном окне программы. Для этого создал в дизайнере диалоговое окно, в которое поместил QGraphicsView. Мне нужно, чтобы в нём отображался пример элементов основного окна с элементами выбранных цветов.

В разделе private класса окна объявил объект QGraphicsScene
QGraphicsScene *scene;


В конструкторе так:
ui->setupUi(this);
ui_grView = qFindChild<QGraphicsView *>(this, "grView");
...
scene = new QGraphicsScene;
ui_grView->setScene(scene);
ui_grView->show();
connect(scene, SIGNAL(changed(QList<QRectF>)), ui_grView, SLOT(updateScene(QList<QRectF>)));

bgCol.setRgb(Qt::black);
bgBrush.setColor(bgCol);
scene->setBackgroundBrush(bgBrush);
...


Не знаю, нужен ли тут connect или задав сцену QGraphicsView я уже задаю связь обновлений. В общем, так не работает, черный фон не появляется. Получилось только если три последних строчки вставить между созданием scene и установкой её объекту ui_grView. Но мне то нужно задать обновление отображения при смене того же цвета фона или цвета одного из других элементов.

Выше представлен последний вариант, который я пробовал. Первоначально у меня был вариант из одного примера с переопределением paintEvent:

void setupMarksColor::paintEvent(QPaintEvent *event)
{
      updateBaseImage();
}

void setupMarksColor::updateBaseImage()
{
    bgBrush.setColor(bgCol);
    scene->setBackgroundBrush(bgBrush);
    
    QList <QRectF> rList;
    rList << ui_grView->sceneRect();
    ui_grView->updateScene(rList);
}


Т.е. пытался обновлять сцену без connect'a в конструкторе. Но тоже пусто. Не очень я понимаю взаимоотношения QGraphicsView и QGraphicsScene и примеры как-то не помогают. Подскажите что исправить и почему, если не сложно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
NordWest
  опции профиля:
сообщение 1.4.2011, 19:57
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 86
Регистрация: 26.11.2008
Пользователь №: 433

Спасибо сказали: 1 раз(а)




Репутация:   0  


Спасибо за ссылку. Для общего представления полезно, но конкретных ответов я там не нашел.

Много чего перепробовал, много непоняток. То одно не рисуется, то другое. То фон черный, кружка нет, то наоборот.

Но всё таки получилось. Вот рабочий вариант:
Раскрывающийся текст
#include "setupmarkscolor.h"
#include "ui_setupmarkscolor.h"

setupMarksColor::setupMarksColor(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::setupMarksColor)
{
    ui->setupUi(this);


    ui_grView = qFindChild<QGraphicsView *>(this, "grView");
    ui_ipixBtn = qFindChild<QPushButton *>(this, "ipixBtn");
    ui_catBtn = qFindChild<QPushButton *>(this, "catBtn");
    ui_refBtn = qFindChild<QPushButton *>(this, "refBtn");
    ui_objBtn = qFindChild<QPushButton *>(this, "objBtn");
    ui_bgBtn = qFindChild<QPushButton *>(this, "bgBtn");


    bgCol = Qt::black;
    ipixCol = Qt::yellow;
    catCol = Qt::blue;
    refCol = Qt::red;
    objCol = Qt::green;



    ipixPen.setColor(ipixCol);
    catPen.setColor(catCol);
    refPen.setColor(refCol);
    objPen.setColor(objCol);

    scene = new QGraphicsScene;
    ui->grView->setRenderHints(QPainter::Antialiasing);
    ui_grView->setScene(scene);
    ui_grView->show();

    scene->setBackgroundBrush(bgCol);

    QRect scR = ui_grView->rect();

    int x0, dx;

    qDebug() << QString("width= %1\n").arg(scR.width());
    dx = scR.width()/4.0;
    x0 = -1.5*dx;

    ipixEll = new QGraphicsEllipseItem(x0, 0, 10, 10);
    scene->addItem(ipixEll);

    x0 += dx;
    catEll = new QGraphicsEllipseItem(x0, 0, 10, 10);
    scene->addItem(catEll);
    x0 += dx;
    refEll = new QGraphicsEllipseItem(x0, 0, 10, 10);
    scene->addItem(refEll);
    x0 += dx;
    objEll = new QGraphicsEllipseItem(x0, 0, 10, 10);
    scene->addItem(objEll);

    ipixEll->setPen(ipixPen);
    catEll->setPen(catPen);
    refEll->setPen(refPen);
    objEll->setPen(objPen);

}

setupMarksColor::~setupMarksColor()
{
    delete ui;
}

void setupMarksColor::changeEvent(QEvent *e)
{
    //qDebug() << "changeEvent\n";
    QDialog::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}

void setupMarksColor::on_bgBtn_clicked()
{
    QColorDialog bgColDlg;//(bgCol);
    bgCol = bgColDlg.getColor(bgCol);
    scene->setBackgroundBrush(bgCol);
}

void setupMarksColor::on_ipixBtn_clicked()
{
    QColorDialog bgColDlg;
    ipixCol = bgColDlg.getColor(ipixCol);
    ipixPen.setColor(ipixCol);
    ipixEll->setPen(ipixPen);
}

void setupMarksColor::on_catBtn_clicked()
{
    QColorDialog bgColDlg;
    catCol = bgColDlg.getColor(catCol);
    catPen.setColor(catCol);
    catEll->setPen(catPen);
}

void setupMarksColor::on_refBtn_clicked()
{
    QColorDialog bgColDlg;
    refCol = bgColDlg.getColor(refCol);
    refPen.setColor(refCol);
    refEll->setPen(refPen);
}

void setupMarksColor::on_objBtn_clicked()
{
    QColorDialog bgColDlg;
    objCol = bgColDlg.getColor(objCol);
    objPen.setColor(objCol);
    objEll->setPen(objPen);
}


Чтобы фон нормально окрасился оказывается надо в метод setBackgroundBrush передавать не QBrush а QColor. Вот как догадаться об этом?

Для объектов QGraphicsEllipseItem можно в методе setPen указать и QPen и QColor.

Ну главное удалось добиться результата, хотя и не очень понятно как.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.1.2025, 13:34