Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt沿循环路径移动文本_C++_Qt_Qt5 - Fatal编程技术网

C++ Qt沿循环路径移动文本

C++ Qt沿循环路径移动文本,c++,qt,qt5,C++,Qt,Qt5,我正在使用Qt5制作一个简单的模拟时钟,我有打印当前时间的想法,例如秒针上方的当前秒数。因此,保存秒值的文本将随着时钟移动 到目前为止,我所拥有的是这样的东西 painter.save(); painter.setPen(Qt::NoPen); pen.setBrush(Qt::white); painter.rotate(360 * (time.second() / 60.0)); painter.drawEllipse(QPointF(0,30), 9, 9); painter.rest

我正在使用Qt5制作一个简单的模拟时钟,我有打印当前时间的想法,例如秒针上方的当前秒数。因此,保存秒值的文本将随着时钟移动

到目前为止,我所拥有的是这样的东西

painter.save();

painter.setPen(Qt::NoPen);
pen.setBrush(Qt::white);
painter.rotate(360 * (time.second() / 60.0));
painter.drawEllipse(QPointF(0,30), 9, 9);

painter.restore();

painter.save();

QRect rec(0, 30, 10, 10);
painter.setPen(Qt::black);
QFont font = painter.font() ;
font.setPointSize(ampmTextSize());
painter.setFont(font);
QFontMetrics fm(font);
int pixelsWide = fm.width(time.toString("ss a").left(2));
int pixelsHigh = fm.height();
rec.setWidth(pixelsWide);
rec.setHeight(pixelsHigh);
painter.rotate(360 * (time.second() / 60.0));
painter.drawText(rec, Qt::AlignCenter, time.toString("ss"));

painter.restore();
从这张图中可以看出,哪种诅咒是不正确的,因为它会导致文本旋转

有人知道如何在Qt中正确地实现这种效果吗

编辑 我忘记提到的是,我希望得到一个涉及Qt函数的解决方案,而不是使用圆的参数方程或类似的解决方案,因为这只是一个练习,所以我可以训练自己使用Qt

如果我们只是想得到我想要跟随的坐标,以便追踪时钟秒针的尖端,那么像这里的等式就足够了

int posx = cos(((360 * (time.second() / 60.0)) * M_PI / 180) - ((90) * M_PI / 180)) * 30.0 + 0;

int posy = sin(((360 * (time.second() / 60.0)) * M_PI / 180) - ((90) * M_PI / 180)) * 30.0 + 0;

然而,我更感兴趣的是学习使用Qt提供的画师来实现这一点的有效方法

你让你的生活变得复杂了?为什么要在单个对象中执行此操作? 您可以使用couple
QGgraphicsViewItem
s轻松完成此操作,无需绘制实现!您将避免许多绘画和表演方面的问题


此外,如果您需要添加一些鼠标功能,则操作起来会容易得多。

我使用
QGraphicsView
实现了一个快速示例:

#include "analogclock.h"

#include <QTimer>
#include <QVector>
#include <QVector>
#include <QTime>
#include <QGraphicsItem>

#include <cmath>

AnalogClock::AnalogClock(QWidget *parent)
    : QGraphicsView(parent)
{
    QTimer *timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(timeout()));
    timer->start(1000);

    setWindowTitle(tr("Analog Clock"));
    resize(200, 200);

    QGraphicsScene* scene = new QGraphicsScene();
    setScene(scene);
    scene->setSceneRect(QRect(-70,-70,140,140));

    static const QVector<QPointF> hourHand(QVector<QPointF>()
        << QPointF(7, 8)
        << QPointF(-7, 8)
        << QPointF(0, -40) );
    static const QVector<QPointF> minuteHand( QVector<QPointF>()
        << QPoint(7, 8)
        << QPoint(-7, 8)
        << QPoint(0, -70) );

    QColor hourColor(127, 0, 127);
    QColor minuteColor(0, 127, 127, 191);

    m_hour = scene->addPolygon(QPolygonF(hourHand), QPen(), QBrush(hourColor));
    m_minute = scene->addPolygon(QPolygonF(minuteHand), QPen(), QBrush(minuteColor));
    m_text = scene->addText("");

    timeout();
}

AnalogClock::~AnalogClock() { }
// This is a protected slot:
void AnalogClock::timeout()
{
    QTime time = QTime::currentTime();

    m_hour->setRotation(30.0 * ((time.hour() + time.minute() / 60.0)));
    qreal mAngle(6.0 * ((time.minute() + time.second() / 60.0)));
    m_minute->setRotation(mAngle);
    m_text->setPos(70.0 * std::sin(mAngle * M_PI / 180.0), -70.0 * std::cos(mAngle * M_PI / 180.0));
    m_text->setPlainText(QString("%1").arg(time.minute()));
}
#包括“analogclock.h”
#包括
#包括
#包括
#包括
#包括
#包括
模拟时钟::模拟时钟(QWidget*父)
:QGraphicsView(父级)
{
QTimer*定时器=新的QTimer(此);
连接(计时器、信号(超时())、此、插槽(超时());
定时器->启动(1000);
setWindowTitle(tr(“模拟时钟”));
调整大小(200200);
qgraphicscene*场景=新的qgraphicscene();
场景(场景);
场景->设置场景(QRect(-70,-70140140));
静态常数QVector hourHand(QVector()
setPos(70.0*std::sin(mAngle*M_-PI/180.0),-70.0*std::cos(mAngle*M_-PI/180.0));
m_text->setPlainText(QString(“%1”).arg(time.minute());
}

对于
main.cpp
和头文件,您可以使用Qt模拟时钟示例,并将其余成员作为私有变量添加到其中。

QWidget
还是
QGraphicsView
painter.save();
建议图形视图).是的,你是对的,我正在探索QGraphicsView的功能。这正是我在这里发布问题的原因。我没有经验去做你建议的事情,所以如果你有时间写一个例子就好了。