Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Gvardman от Июнь 09, 2014, 03:19



Название: Проблема при отрисовка линии на виджете
Отправлено: Gvardman от Июнь 09, 2014, 03:19
Добрый день, помогите пожалуйста.
Я написал класс – линию. Рисую на виджете. Проблема в том, что линию получается нарисовать только в верхней части виджета, примерно на пятой его части. Дальше не рисует.

Файл MainWindow.cpp
Код:
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ln = new Line(ui->widget, 10, 20, 50, 500);
    ui->widget->setAttribute(Qt::WA_OpaquePaintEvent);
    ui->widget->show();
}

Файл Line.h
Код:
class Line : public QWidget
{
    Q_OBJECT
    qreal x1, y1, x2, y2;
public:
    explicit Line(QWidget *parent, qreal px1, qreal py1, qreal px2, qreal py2);
    void draw(QPainter *painter);
protected:
    void paintEvent(QPaintEvent *);
signals:
 
public slots:
 
};

Файл Line.cpp
Код:
Line::Line(QWidget *parent, qreal px1, qreal py1, qreal px2, qreal py2) :
    QWidget(parent), x1(px1), y1(py1), x2(px2), y2(py2)
{
}
 
void Line::paintEvent(QPaintEvent *)
{
  QPainter painter(this);
  draw(&painter);
}
 
void Line::draw(QPainter *painter)
{
    painter->setPen(QPen(Qt::red, 1, Qt::SolidLine));
    qreal  x_cur = x1, y_cur = y1;
 
    while( x_cur != x2 || y_cur != y2 )
    {
        painter->drawPoint(QPointF(x_cur, y_cur));
        if (x_cur != x2)
        {
            if (x_cur < x2)
                ++x_cur;
            else
                --x_cur;
        }
        if (y_cur != y2){
            if (y_cur < y2)
                ++y_cur;
            else
                --y_cur;
        }
    }
}

Картинка с максимальной высотой линии, которую мне удалось нарисовать. Ниже не идет.
(http://s020.radikal.ru/i703/1406/b4/37c87fbf5a87.png)

Буду очень благодарен за помощь! :)


Название: Re: Проблема при отрисовка линии на виджете
Отправлено: carrygun от Июнь 09, 2014, 04:15
Ваш Line нужно добавлять в centralWidget() в случае с QMainWindow, или в QLayout в случае с простым QWidget.


Название: Re: Проблема при отрисовка линии на виджете
Отправлено: Gvardman от Июнь 09, 2014, 05:11
Ваш Line нужно добавлять в centralWidget() в случае с QMainWindow, или в QLayout в случае с простым QWidget.
Попробовал рисовать сразу в QMainWindow, создавал Line так:
Код:
ln = new Line(centralWidget(), 10, 10, 10, 500);
Не помогло, все равно ниже не рисует.
Попробовал с QLayout:
Код:
ln = new Line(ui->widget, 10, 10, 50, 500);
QLayout *layout = ln->layout();

Тоже самое :(


Название: Re: Проблема при отрисовка линии на виджете
Отправлено: gil9red от Июнь 09, 2014, 08:07
Ваш Line нужно добавлять в centralWidget() в случае с QMainWindow, или в QLayout в случае с простым QWidget.
Попробовал рисовать сразу в QMainWindow, создавал Line так:
Код:
ln = new Line(centralWidget(), 10, 10, 10, 500);
Не помогло, все равно ниже не рисует.
Попробовал с QLayout:
Код:
ln = new Line(ui->widget, 10, 10, 50, 500);
QLayout *layout = ln->layout();

Тоже самое :(

Типа такого:
Код
C++ (Qt)
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
   ui->setupUi(this);
   ln = new Line(ui->widget, 10, 20, 50, 500);
   QVBoxLayout * layout = new QVBoxLayout ();
   layout->addWidget(ln);
   ui->widget->setLayout( layout );
   ui->widget->setAttribute(Qt::WA_OpaquePaintEvent);
   ui->widget->show();
}