Рисование линии в QWidget

Я пытаюсь создать виджет, состоящий из одной горизонтальной черной линии. Этот виджет будет помещен в QGridLayout таким образом, что он будет занимать всю строку, действуя как разделитель. Поскольку размер виджета, на котором установлен макет, изменяется, я бы хотел, чтобы линия меняла свой размер, чтобы не отставать. Я проверил несколько вариантов, включая QLine, QGraphicsView и QImage, но я не могу нарисовать линию, не говоря уже о том, чтобы изменить ее размер.

Я реализую это в своем собственном классе, поэтому я могу повторно использовать его по мере необходимости. Кто-нибудь может помочь мне с этим?

#include "startMenuSectionFooter.h"

#include <QtGui>

StartMenuSectionFooter::StartMenuSectionFooter( QWidget *parent )
  : QWidget( parent )
{
  layout = new QHBoxLayout( this );
}

void StartMenuSectionFooter::paintEvent( QPainEvent *e )
{
  QPointF p1 = QPointF( parentWidget()->height(), 0 );
  QPointF p2 = QPointF( parentWidget()->height(), parentWidget()->width() );

  QPainter painter( this );
  painter.setRenderHint( QPainter::Antialiasing, true );
  painter.setPen( QPen( Qt::black, 10 ) );

  painter.drawLine( p1, p2 );
}

В этом случае parent является родительскимQWidget, на котором установлен QGridLayout, упомянутый ранее.

#ifndef START_MENU_SECTION_FOOTER_H
#define START_MENU_SECTION_FOOTER_H

#include <QWidget>

class QHBoxLayout;
class QPainEvent;

class StartMenuSectionFooter : public QWidget
{
  Q_OBJECT

  QBHoxLayout *layout;

  void paintEvent( QPainEvent *e );

public:
  StartMenuSectionFooter( QWidget *parent = NULL );
};

#endif

person Community    schedule 19.06.2012    source источник
comment
Можете ли вы показать нам скриншот того, как это выглядит до сих пор? AFAIK, я не думаю, что вы можете заставить виджет занимать несколько мест в QGridLayout, лучшим подходом может быть создание горизонтальной линии и размещение ее в каждом столбце (одна и та же строка)   -  person eqzx    schedule 19.06.2012
comment
Вы пытались использовать QFrame с формой кадра, установленной на HLine?   -  person RA.    schedule 19.06.2012
comment
@RA, это именно то, что я искал, спасибо :) Если вы напишете это как ответ, я приму его.   -  person    schedule 19.06.2012


Ответы (2)


Самый простой способ создать горизонтальную линию в Qt — использовать QFrame со свойством frameShape, установленным на QFrame::HLine. Затем вы можете поместить этот фрейм в макет сетки с соответствующим диапазоном столбцов. Вот простой, надуманный пример:

QFrame* myFrame = new QFrame();
myFrame->setFrameShape(QFrame::HLine);

const int NUMBER_OF_COLUMNS_IN_GRID = 4;
myGridLayout->addWidget(myFrame, 0, 0, 1, NUMBER_OF_COLUMNS_IN_GRID);

Это должно делать все, что вам нужно, включая автоматическое изменение размера при изменении размера родительского макета. Вы также можете поиграть с палитрой фрейма, чтобы отобразить его в нужном цвете.

person RA.    schedule 19.06.2012

Вы неправильно написали QPaintEvent. Ошибочное написание означает, что ваша функция paintEvent() не переопределяет функцию paintEvent() базовых классов.

Поскольку вы никогда не используете переменную e из "QPainEvent", синтаксическая ошибка отсутствует.

person Colin Jensen    schedule 01.03.2016