Russian Qt Forum
Ноябрь 23, 2024, 07:49 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Динамическое изменение размера виджета и перенос начала координат.  (Прочитано 5528 раз)
PunisherPCK
Гость
« : Январь 17, 2014, 17:30 »

Здравствуйте.

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

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

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

Заранее спасибо.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Январь 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);
}
 
Записан

PunisherPCK
Гость
« Ответ #2 : Январь 19, 2014, 22:20 »

Таким образом переносится только система координат. Как тогда сделать, чтобы и видимая часть виджета начиналась с него? Тем способом, что пытался я, размер виджета изменяется, но только относительно начала координат по умолчанию, т.е (0, 0).
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #3 : Январь 20, 2014, 05:21 »

Минимально компилируемый код, с вашей проблемой в студию Улыбающийся
Записан

PunisherPCK
Гость
« Ответ #4 : Январь 21, 2014, 19:18 »

Ошибка такая: на рисунке строится эллипс по центральной точке и двум векторам. Часть находится за пределами видимой области.



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

Код:
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();
}
« Последнее редактирование: Январь 21, 2014, 19:28 от PunisherPCK » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #5 : Январь 21, 2014, 19:59 »

Хм, ну я просил компилируемый код )
Ладно...

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

PunisherPCK
Гость
« Ответ #6 : Январь 21, 2014, 21:28 »

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

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

Сообщений: 1805



Просмотр профиля WWW
« Ответ #7 : Январь 21, 2014, 22:01 »

Если это будет работать, то считайте, что сделали все правильно, а если очень нужно, допилить всегда можно Подмигивающий
Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.084 секунд. Запросов: 23.