Проблема при отрисовка линии на виджете



  • Добрый день, помогите пожалуйста.
    Я написал класс - линию. Рисую на виджете. Проблема в том, что линию получается нарисовать только в верхней части виджета, примерно на пятой его части. Дальше не рисует.

    Файл 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()!

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



  • Добрый день.
    Добро пожаловать в DevNet.

    Выш класс Line является виджетом и вы рисуете линию внутри этого виджета. Проверьте размеры виджета Line.

    Но давайте посмотрим что именно ван нужно. У вас сечас есть MainWindow внутри него виджет widget и внутри него виджет Line и уже внутри Line вы рисуете линию. Мне кажется это не совсем то чего вы добивались. Что должно быть конечным результатом?



  • Мне надо, чтоб при создании объекта Line и указании ему в конструкторе виджета, на котором рисовать и координат точек линии, линия появлялась на виджете, указанном в конструкторе.



  • Я думаю вы уже просмотрели коды примеров:"Basic Drawing Example":https://qt-project.org/doc/qt-5/qtwidgets-painting-basicdrawing-example.html ?
    Рисовать в виджетах нужно в теле события paintEvent или перегрузив виджет (рекомендуемый вариант) или перехватывая событие ("eventFilter":http://qt-project.org/doc/qt-5/eventsandfilters.html) .



  • Я перегрузил paintEvent...



  • Вы должны перегрузить paintEvent виджета на котором собираетесь рисовать. А вкоде выше вы перегрузили для Line, соответственно вы рисуете в Line а не в widget.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.