【问题标题】:Drawing a line on a QWidget在 QWidget 上画一条线
【发布时间】:2012-06-19 19:17:22
【问题描述】:

我正在尝试创建一个由一条水平黑线组成的小部件。这个小部件将被放置在 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 是安装了前面提到的QGridLayout 的父QWidget

#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

【问题讨论】:

  • 你能给我们看一张到目前为止的截图吗? AFAIK,我不认为你可以让一个小部件在 QGridLayout 中占据多个位置,更好的方法可能是制作一条水平线并将其放在每一列(同一行)
  • 您是否尝试过使用框架形状设置为 HLine 的 QFrame?
  • @RA,这正是我想要的,谢谢 :) 如果你把它写成答案,我会继续接受。

标签: qt qpainter


【解决方案1】:

在 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);

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-20
      • 1970-01-01
      • 2017-08-11
      • 2011-09-30
      • 1970-01-01
      相关资源
      最近更新 更多