如何居中 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();
}
输出:
如何在我的水平线的中心居中一条垂直线以形成十字。我当前的实现没有适当地使垂直线居中。
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();
}
输出: