Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: PunisherPCK от Январь 17, 2014, 17:30



Название: Динамическое изменение размера виджета и перенос начала координат.
Отправлено: PunisherPCK от Январь 17, 2014, 17:30
Здравствуйте.

Проблема состоит в следующем:
Размер виджета определяется как:this->setMinimumSize(qApp->desktop()->height(), qApp->desktop()->width())
Начало координат соответственно в точке (0, 0).

Затем на виджете рисуется какой-нибудь графический объект.
Существует вероятность, что он выйдет за пределы виджета.

Как динамически изменять размер виджета я понял. Но как перенести систему координат с точки (0, 0) на пример в точку ( 0, -100). Как раз в этой невидимой части и находится часть моего объекта.

Заранее спасибо.


Название: Re: Динамическое изменение размера виджета и перенос начала координат.
Отправлено: gil9red от Январь 17, 2014, 17:46
Но как перенести систему координат с точки (0, 0) на пример в точку ( 0, -100).

Рисуете через QPainter, да?
Тогда используется метод translate
Пример:
http://qtdocs.narod.ru/4.1.0/doc/html/qpainter.html
Код
C++ (Qt)
void MyWidget::paintEvent()
{
   QPainter paint(this);
   paint.drawPoint(0, 0);
   paint.translate(100.0, 40.0);
   paint.drawPoint(-100, -40);
}
 


Название: Re: Динамическое изменение размера виджета и перенос начала координат.
Отправлено: PunisherPCK от Январь 19, 2014, 22:20
Таким образом переносится только система координат. Как тогда сделать, чтобы и видимая часть виджета начиналась с него? Тем способом, что пытался я, размер виджета изменяется, но только относительно начала координат по умолчанию, т.е (0, 0).


Название: Re: Динамическое изменение размера виджета и перенос начала координат.
Отправлено: gil9red от Январь 20, 2014, 05:21
Минимально компилируемый код, с вашей проблемой в студию :)


Название: Re: Динамическое изменение размера виджета и перенос начала координат.
Отправлено: PunisherPCK от Январь 21, 2014, 19:18
Ошибка такая: на рисунке строится эллипс по центральной точке и двум векторам. Часть находится за пределами видимой области.

(http://ib3.keep4u.ru/s/2014/01/21/ac/ac36e64777af954df570ac26565d74a8.jpg) (http://keep4u.ru/full/ac36e64777af954df570ac26565d74a8.html)

Это виджет, на котором происходит рисование. Тут и переопределяется событие рисования.

Код:
GraphWidget::GraphWidget( int h, int w, QWidget * parent )
    : QWidget( parent ),
      width( w ),
      height( h )
{
    buf = new QPixmap( width, height );
    buf->fill( Qt::white );
}

Виджет главного окна.

Код:
MainWindow::MainWindow(QWidget * parent)
    : QMainWindow( parent )
{

    graphWidget = new GraphWidget( qApp->desktop()->height() + 1000, qApp->desktop()->width() + 1000, this );


    CreateActions();
    CreateMenus();

    QScrollArea * areaScroll = new QScrollArea;
    areaScroll->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOn );
    areaScroll->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOn );
    areaScroll->setWidget( graphWidget );

    CreateToolbars();

    QHBoxLayout *centralLayout = new QHBoxLayout;
    centralLayout->addWidget( areaScroll );

    QWidget *mainWidget = new QWidget;
    mainWidget->setLayout( centralLayout );

    setCentralWidget( mainWidget );

}

Это функция рисования, подходящая для любой кривой.

Код:
void GraphCurve::PaintCurve( MbCurve * curve, QPixmap * buf, const QColor & col1, const QColor &  col2 )
{
    QPainter painter;
    QPainterPath path;
    MbCartPoint point;
    vector< double > param;
    double tMin, tMax;

    painter.begin( buf );
    painter.setPen( QPen(col1, 5) );

    tMin = curve->GetMinValueParameter();
    tMax = curve->GetMaxValueParameter();

    curve->StepParameter( tMin, tMax, param );
    curve->CalcPointCurve( param[0], point );
    path.moveTo( point.x, point.y );

    painter.setPen( col2 );
    for( vector< double >::iterator i = param.begin() + 1; i != param.end(); ++i) {
        curve->CalcPointCurve( *i, point );
        path.lineTo( point.x, point.y );
    }
    painter.drawPath( path );
    painter.end();
}


Название: Re: Динамическое изменение размера виджета и перенос начала координат.
Отправлено: gil9red от Январь 21, 2014, 19:59
Хм, ну я просил компилируемый код )
Ладно...

Код
C++ (Qt)
graphWidget = new GraphWidget( qApp->desktop()->height() + 1000, qApp->desktop()->width() + 1000, this );
 
Так и должно быть? А сам виджет принимает такие же размеры, как у картинки? Вы же тут указываете размер картинки, которая будет отрисована на виджете, и как я понимаю, которая будет передана в функцию void GraphCurve::PaintCurve().
Если я прав, виджету установите такие же размеры, как и у картинки, которая рисуется на нем (например, через setFixedSize())
Если проблема не связана с размеров виджета, тогда дело с параметрами отрисовки кривой :)


Название: Re: Динамическое изменение размера виджета и перенос начала координат.
Отправлено: PunisherPCK от Январь 21, 2014, 21:28
GraphWidget принимает размеры равные разрешению экрана + 1000px. Затем делаем его ресайз на эти размеры. Затем создаем QPixmap c теми же размерами. Затем рисуем pixmap из точки (0,0).
Одной из кривых является эллипс. Пользователь с помощью установки трех точек строит эллипс. Но может получиться, что часть эллипса находится в отрицательной полуплоскости. Моя же начинается с точки (0,0).

Т.е если наименьшая, а следовательно самая дальнейшая точка имеет координаты (50, -100), нужно перенести систему координат с помощью translate в точку (0, -100), затем с помощью setFixedSize увеличить высоту виджета на 100px, затем с помощью drawPixmax отрисовать QPixmap, начиная с точки (0, -100). Правильный ход?


Название: Re: Динамическое изменение размера виджета и перенос начала координат.
Отправлено: gil9red от Январь 21, 2014, 22:01
Если это будет работать, то считайте, что сделали все правильно, а если очень нужно, допилить всегда можно ;)