用Qt实现给定开始时间和结束时间,画出时间轴
时间: 2023-11-14 08:14:34 浏览: 163
可以使用Qt的绘图功能来实现时间轴的绘制,以下是一个简单的示例代码:
```cpp
#include <QtWidgets>
class TimeLineWidget : public QWidget {
public:
TimeLineWidget(QWidget* parent = nullptr)
: QWidget(parent) {
setFixedSize(600, 100);
}
void setStartTime(const QTime& time) {
m_startTime = time;
update();
}
void setEndTime(const QTime& time) {
m_endTime = time;
update();
}
protected:
void paintEvent(QPaintEvent* event) override {
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
int width = this->width();
int height = this->height();
int margin = height * 0.2;
// 绘制时间轴底部的线
painter.drawLine(margin, height / 2, width - margin, height / 2);
// 绘制起始时间和结束时间
painter.setFont(QFont("Arial", 10));
painter.drawText(QRectF(0, 0, margin, height), Qt::AlignCenter, m_startTime.toString("hh:mm"));
painter.drawText(QRectF(width - margin, 0, margin, height), Qt::AlignCenter, m_endTime.toString("hh:mm"));
// 绘制时间范围
painter.setFont(QFont("Arial", 8));
QString rangeText = QString("%1 - %2").arg(m_startTime.toString("hh:mm")).arg(m_endTime.toString("hh:mm"));
QRectF rangeRect = painter.boundingRect(QRectF(0, 0, width, height), Qt::AlignCenter, rangeText);
painter.drawText(QRectF(width / 2 - rangeRect.width() / 2, height / 2 + margin / 2, rangeRect.width(), rangeRect.height()), rangeText);
// 绘制时间刻度
int tickCount = 12;
double tickInterval = (width - margin * 2) / (double)(tickCount - 1);
for (int i = 0; i < tickCount; ++i) {
double x = margin + i * tickInterval;
painter.drawLine(x, height / 2 - 5, x, height / 2 + 5);
QString tickText = m_startTime.addSecs(i * 3600).toString("hh:mm");
QRectF tickRect = painter.boundingRect(QRectF(0, 0, width, height), Qt::AlignLeft | Qt::AlignVCenter, tickText);
painter.drawText(QRectF(x - tickRect.width() / 2, height / 2 + margin / 2, tickRect.width(), tickRect.height()), tickText);
}
}
private:
QTime m_startTime;
QTime m_endTime;
};
int main(int argc, char** argv) {
QApplication app(argc, argv);
QTime startTime(8, 0);
QTime endTime(20, 0);
TimeLineWidget widget;
widget.setStartTime(startTime);
widget.setEndTime(endTime);
widget.show();
return app.exec();
}
```
在这个示例代码中,我们首先创建了一个名为TimeLineWidget的QWidget子类,用于绘制时间轴。该类中包含了设置起始时间和结束时间的方法,以及重写的paintEvent方法,用于实际的绘制操作。
在paintEvent方法中,我们首先绘制了时间轴底部的线。接着,我们绘制了起始时间和结束时间的文本,并将其放置在时间轴两端,使用了QPainter的drawText方法。然后,我们绘制了时间范围的文本,使用了boundingRect方法计算出文本的矩形框,并将其居中放置在时间轴中央。
最后,我们绘制了时间刻度。在这里,我们设置了12个时间刻度,每个时间刻度代表一个小时,使用了QTime的addSecs方法计算出每个时间刻度所代表的时间点。然后,我们根据时间刻度的位置和文本的大小,将时间刻度的文本居中放置在时间轴上方。
通过这样的方式,我们就可以在Qt中绘制出一个简单的时间轴。
阅读全文