如何居中 QLine

How to center a QLine

如何在我的水平线的中心居中一条垂直线以形成十字。我当前的实现没有适当地使垂直线居中。

void crossWidget::paintEvent(QPaintEvent* event)
{
    QPainter painter(this);
    painter.setPen(QPen(Qt::black, Qt::SolidLine));
    QLine originLine;
    int width = parent->width();
    int height = parent->height();

    originLine.setP1(QPoint(-width, 0));
    originLine.setP2(QPoint(width, 0));
    originLine.setLine( -(width / 2), 0, width / 2, 0);
    painter.drawLine(originLine);

    painter.setPen(QPen(Qt::black, Qt::DashLine));
    QLine originHLine;
    originHLine.setP1(QPoint(0, -height));
    originHLine.setP2(QPoint(0, height));
    originHLine.setLine(
        originLine.center().x(),
        originLine.center().y() - (height / 2) ,
        originLine.center().x(), 
        originLine.center().y() + (height / 2));
    painter.drawLine(originHLine);
    
}

要画十字,您需要 canvas 几何图形的中点...

你的水平线(红色的)会将你的 canvas 分成 2 个相同的形状,一个在另一个上面..所以你需要 y 轴的中点。 与此类似,您的垂直线(蓝色一条)会将 canvas 分成 t 个相同的部分,因此您需要 x 轴的中点。

在qt中你可以通过给定起点和终点画一条线

所以你需要像

这样的东西
drawLine(0, H/2, W, H/2);

例如,这将绘制红线...

看我的参考图片:

我想知道为什么那么复杂……

#include <QtWidgets>

class CrossWidget: public QWidget {

  public:
    CrossWidget(QWidget* pQParent = nullptr):
      QWidget(pQParent)
    { }

    virtual ~CrossWidget() = default;

    CrossWidget(const CrossWidget&) = delete;
    CrossWidget& operator=(const CrossWidget&) = delete;

  protected:
    virtual void paintEvent(QPaintEvent* pQEvent) override;
};

void CrossWidget::paintEvent(QPaintEvent* pQEvent)
{
  const int w = width(), h = height();
  const int wH = w / 2, hH = h / 2;
  QPainter qPainter(this);
  qPainter.drawLine(0, hH, w, hH);
  qPainter.drawLine(wH, 0, wH, h);
}

int main(int argc, char** argv)
{
  qDebug() << "Qt Version:" << QT_VERSION_STR;
  QApplication app(argc, argv);
  // setup GUI
  CrossWidget qWinMain;
  qWinMain.show();
  // runtime loop
  return app.exec();
}

输出:


OP 指出布局可能会缩小 CrossWidget 使其实际上不可见。为防止这种情况,sizeHint() 可能会过载:

#include <QtWidgets>

class CrossWidget: public QWidget {

  public:
    CrossWidget(QWidget* pQParent = nullptr):
      QWidget(pQParent)
    { }

    virtual ~CrossWidget() = default;

    CrossWidget(const CrossWidget&) = delete;
    CrossWidget& operator=(const CrossWidget&) = delete;

  protected:
    virtual QSize sizeHint() const override { return QSize(20, 20); }

    virtual void paintEvent(QPaintEvent* pQEvent) override;
};

void CrossWidget::paintEvent(QPaintEvent* pQEvent)
{
  const int w = width(), h = height();
  const int wH = w / 2, hH = h / 2;
  QPainter qPainter(this);
  qPainter.drawLine(0, hH, w, hH);
  qPainter.drawLine(wH, 0, wH, h);
}

int main(int argc, char** argv)
{
  qDebug() << "Qt Version:" << QT_VERSION_STR;
  QApplication app(argc, argv);
  // setup GUI
  QWidget qWinMain;
  QHBoxLayout qHBox;
  QLabel qLbl("A cross widget:");
  qHBox.addWidget(&qLbl, 1);
  CrossWidget qCross;
  qHBox.addWidget(&qCross);
  qWinMain.setLayout(&qHBox);
  qWinMain.show();
  // runtime loop
  return app.exec();
}

输出: