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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема при отрисовка линии на виджете  (Прочитано 2749 раз)
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;
        }
    }
}

Картинка с максимальной высотой линии, которую мне удалось нарисовать. Ниже не идет.


Буду очень благодарен за помощь! Улыбающийся
Записан
carrygun
Гость
« Ответ #1 : Июнь 09, 2014, 04:15 »

Ваш Line нужно добавлять в centralWidget() в случае с QMainWindow, или в QLayout в случае с простым QWidget.
Записан
Gvardman
Гость
« Ответ #2 : Июнь 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();

Тоже самое Грустный
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



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

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


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