• 16689阅读
  • 23回复

QT滚动字(已解决) [复制链接]

上一主题 下一主题
离线faholiang
 
只看楼主 倒序阅读 楼主  发表于: 2010-01-29
— 本帖被 午小夜 执行加亮操作(2010-01-29) —
想请问一个滚动字的问题,请问有什么好的实现方法,最好附上代码
谢谢
[ 此帖被faholiang在2010-02-08 17:06重新编辑 ]
离线xinqingfly

只看该作者 1楼 发表于: 2010-01-29
加个定时器 ,不停的move,要么就重载绘制函数,自己去画,也可以看看qt的动画类
菜鸟也是鸟
离线午小夜

只看该作者 2楼 发表于: 2010-01-29
定時器控制position,在paintEvent裏面drawText
[操作系统版本]  Windows XP;Linux Ubuntu;Linux Fedora;
[Qt SDK版本]    4.7.0
[SDK 发布日期]  2010.05
[IDE(集成开发环境)] QtCreator
个人网页:http://hi.baidu.com/午小夜
學歷:Royal Jalidon
离线yangfanxing
只看该作者 3楼 发表于: 2010-01-29
int i = 0;
while(i < Num)
{
    QString str;
    **->setext(str.insert(0,QString(" ")));
    i++;
}
或许这个就足够了,就是不停增加QString前边的空格,步进++而已,但是这得移动得多快啊~~~
我承认我XE了~~~LZ可以无视。。。嘎嘎。。。
PHPWind好恶心。。。不想看这种界面。。。
离线faholiang
只看该作者 4楼 发表于: 2010-01-29
呵呵。有创意才有新意。每个人的想法都有他的奇妙所在
离线faholiang
只看该作者 5楼 发表于: 2010-01-29
午小夜,您好。
  这个我也写过,也实现了,不过有一个事情就是当文字的长度大于该Widget
的时候,结果就显示不了了
离线午小夜

只看该作者 6楼 发表于: 2010-01-29
引用第5楼faholiang于2010-01-29 14:12发表的  :
午小夜,您好。
  这个我也写过,也实现了,不过有一个事情就是当文字的长度大于该Widget
的时候,结果就显示不了了


這不可能,那是你的代碼沒處理好。我有寫過抓取股市信息並且滾動顯示的代碼。股市信息再長都能夠循環播放。
[操作系统版本]  Windows XP;Linux Ubuntu;Linux Fedora;
[Qt SDK版本]    4.7.0
[SDK 发布日期]  2010.05
[IDE(集成开发环境)] QtCreator
个人网页:http://hi.baidu.com/午小夜
學歷:Royal Jalidon
离线faholiang
只看该作者 7楼 发表于: 2010-01-29
能把源代码SHOW一下看看吗?
简单一点的
离线午小夜

只看该作者 8楼 发表于: 2010-01-29
構造函數裏初始化m_pos = (int)((double)810/1024*m_iScreenWidth);          //m_iScreenWidth為屏幕分辨率的width.
void Stock::drawTimerSlot()
{
    m_pos -= this->fontMetrics().maxWidth()/20;                   //control the speed.
    if(m_pos <= 0-m_text.length()*this->fontMetrics().maxWidth()/5)
    {
        m_pos = (int)((double)810/1024*m_iScreenWidth);
    }
    this->update();
}


void Stock::paintEvent(QPaintEvent *e)
{      
    QPainter painter;
    painter.begin(this);
    painter.drawText((int)((double)m_pos/1024*m_iScreenWidth),(int)((double)30/768*m_iScreenHeight),m_text);
    painter.end();
}
[操作系统版本]  Windows XP;Linux Ubuntu;Linux Fedora;
[Qt SDK版本]    4.7.0
[SDK 发布日期]  2010.05
[IDE(集成开发环境)] QtCreator
个人网页:http://hi.baidu.com/午小夜
學歷:Royal Jalidon
离线linjack

只看该作者 9楼 发表于: 2010-01-29
头文件
#ifndef TICKER_H
#define TICKER_H

#include <QWidget>

class Ticker : public QWidget
{
    Q_OBJECT
    Q_PROPERTY(QString text READ text WRITE setText)

public:
    Ticker(QWidget *parent = 0);

    void setText(const QString &newText);
    QString text() const { return myText; }
    QSize sizeHint() const;

protected:
    void paintEvent(QPaintEvent *event);
    void timerEvent(QTimerEvent *event);
    void showEvent(QShowEvent *event);
    void hideEvent(QHideEvent *event);

private:
    QString myText;
    int offset;
    int myTimerId;
};

#endif

cpp文件
#include <QtGui>

#include "ticker.h"

Ticker::Ticker(QWidget *parent)
    : QWidget(parent)
{
    offset = 0;
    myTimerId = 0;
}

void Ticker::setText(const QString &newText)
{
    myText = newText;
    update();
    updateGeometry();
}

QSize Ticker::sizeHint() const
{
    return fontMetrics().size(0, text());
}

void Ticker::paintEvent(QPaintEvent * /* event */)
{
    QPainter painter(this);

    int textWidth = fontMetrics().width(text());
    if (textWidth < 1)
        return;
    int x = -offset;
    while (x < width()) {
        painter.drawText(x, 0, textWidth, height(),
                         Qt::AlignLeft | Qt::AlignVCenter, text());
        x += textWidth;
    }
}

void Ticker::showEvent(QShowEvent * /* event */)
{
    myTimerId = startTimer(30);
}

void Ticker::timerEvent(QTimerEvent *event)
{
    if (event->timerId() == myTimerId) {
        ++offset;
        if (offset >= fontMetrics().width(text()))
            offset = 0;
        scroll(-1, 0);
    } else {
        QWidget::timerEvent(event);
    }
}

void Ticker::hideEvent(QHideEvent * /* event */)
{
    killTimer(myTimerId);
    myTimerId = 0;
}

main文件
#include <QApplication>

#include "ticker.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    Ticker ticker;
    ticker.setWindowTitle(QObject::tr("Ticker"));
    ticker.setText(QObject::tr("How long it lasted was impossible to "
                               "say ++ "));
    ticker.show();
    return app.exec();
}
C++ GUI qt4 编程第二版 第7章的例子
要多看书……
描述:书上例子
附件: ticker.rar (2 K) 下载次数:152 ,该附件已加密,拥有1威望才能下载
加油学QT
离线faholiang
只看该作者 10楼 发表于: 2010-01-29
书上这个例子我改过,原来的好像会不断复制直到到头为止
离线faholiang
只看该作者 11楼 发表于: 2010-01-29
很感谢各位的帮助,现在我通过午小夜的方法已经改好了
离线faholiang
只看该作者 12楼 发表于: 2010-02-08
很感谢午小夜跟各位朋友的帮助,让我有了很大的提升
离线channon
只看该作者 13楼 发表于: 2010-02-09
我也贡献一下自己的代码吧。见附件
附件: qscrollmessage.h (2 K) 下载次数:107
附件: qscrollmessage.cpp (8 K) 下载次数:121
操作系统: Archlinux
Qt SDK: Qt 4.7.1 for Linux
开发方向: Qt,Java
常用数据库:Firebird、SQLite
离线mikan
只看该作者 14楼 发表于: 2010-06-06
学习.....
离线kovchou

只看该作者 15楼 发表于: 2010-06-08
回 13楼(channon) 的帖子
怎么用啊。。不会用。。呵呵
离线getget
只看该作者 16楼 发表于: 2010-06-11
引用第13楼channon于2010-02-09 08:10发表的 :
我也贡献一下自己的代码吧。见附件

顶灰太狼。
离线longwenbiao
只看该作者 17楼 发表于: 2010-06-12
回 9楼(linjack) 的帖子
这个程序(Ticker类)动态改变text,会出现抖动现象,你有没有办法去解决?呵呵
离线longwenbiao
只看该作者 18楼 发表于: 2010-06-12
楼主,你有没有动态改变滚动的字幕,会不会出现抖动现象?
离线ding404
只看该作者 19楼 发表于: 2010-06-12
抖动现象用双缓冲吧
离线longwenbiao
只看该作者 20楼 发表于: 2010-06-12
回 19楼(ding404) 的帖子
能详细点不?
离线winembedded

只看该作者 21楼 发表于: 2010-12-22
不错,有用
离线biosxjj

只看该作者 22楼 发表于: 2010-12-22
写个lineedit  包括所有文字那么长 然后一个定时器
然后一个widget 窗口。。把lineedit 从左向右移动。。。这样应该不会抖动
离线584233185
只看该作者 23楼 发表于: 2012-03-24
   多看书
快速回复
限100 字节
 
上一个 下一个