9

我正在尝试创建一个由一条水平黑线组成的小部件。这个小部件将被放置在 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的父级。QWidgetQGridLayout

#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
4

2 回答 2

12

在 Qt 中创建水平线的最简单方法是使用 aQFrame并将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);

这应该做你需要做的一切,包括在父布局调整大小时自动调整大小。您还可以使用框架的调色板以所需的颜色显示它。

于 2012-06-19T19:31:36.587 回答
1

您拼错了 QPain t Event。拼写错误意味着您的paintEvent() 函数不会覆盖基类的paintEvent()。

因为你从不使用“QPainEvent”的变量e,所以没有语法错误。

于 2016-03-01T03:53:47.313 回答