Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > бегущая строка


Автор: vlarry 28.3.2011, 14:32
Добрый день, форумчане! Подскажите пожалуйста по такому вопросу. Я реализую бегущую строку в QLabel. Все работает, но с правой стороны от QLabel видно ту часть строки, которая находится за пределами. С левой такого не наблюдается. Что это может быть. QLabel расположена на QWidget.
user posted imageuser posted image

Автор: bsa 28.3.2011, 14:55
QPainter::setClipRect использовать пробовал?

Автор: borisbn 28.3.2011, 15:03
Цитата(vlarry @  28.3.2011,  14:32 Найти цитируемый пост)
Я реализую бегущую строку в QLabel

думаю, ответ зависит от того, как ты это делаешь. нет ?

Автор: vlarry 28.3.2011, 15:25
Цитата(bsa @  28.3.2011,  14:55 Найти цитируемый пост)
QPainter::setClipRect использовать пробовал? 

еще не пробовал..сей час попробую
вот код:

Код

#include "../header/runstr.h"
//-----------------------------------------------------------------------------------------------
RunStr::RunStr(QWidget *parent): QLabel(parent), m_parent(parent)
{
    
}
//--------------------------------------------------------------------
RunStr::RunStr(const QString string, QWidget *parent): QLabel(parent), m_parent(parent)
{
    initDefault();
    m_string = tr(string.toAscii());
}
//--------------------------------------------------------------------
void RunStr::paintEvent(QPaintEvent*)
{
    QPainter painter(this);
    painter.drawRect(0, 0, m_sizeFieldStr.width(), m_sizeFieldStr.height());
    painter.drawText(m_coordStr, m_string);
}
//--------------------------------------------------------------------
void RunStr::initDefault()
{
    QTextCodec *codec = QTextCodec::codecForName("cp1251");
    QTextCodec::setCodecForTr(codec);

    m_font  = QFont(tr("Arial"), 20, 20);
    m_color = QColor(Qt::black);

    m_dirStr    = dirRight;
    m_posField  = posCentre;
    m_sizeField = sizeStr;
}
//---------------------------------------------------------------------
void RunStr::setSize()
{
    if(m_parent != 0)
        m_sizeWgt = m_parent->size();
    else
        m_sizeWgt = QSize(640, 480);

    QFontMetrics fm(m_font);

    // установка ширины и высоты строки в пикселах
    m_sizeStr.setWidth(fm.width(m_string));   // ширина строки в пикселах
    m_sizeStr.setHeight(fm.height());   // высота символа в пикселах

    // установка ширины и высоты поля вывода в пикселах
    if(m_sizeField == sizeWgt)
        m_sizeFieldStr.setWidth(m_sizeWgt.width());
    else
        if(m_sizeField == sizeStr)
            m_sizeFieldStr.setWidth(m_sizeStr.width());

    m_sizeFieldStr.setHeight(m_sizeStr.height());

    // установка поля вывода на экране
    if((m_posField & posLeft))
        m_coordFieldStr.setX(0);
    else
        if((m_posField & posRight))
            m_coordFieldStr.setX(m_sizeWgt.width() - m_sizeFieldStr.width());
        else
            if((m_posField & posHCentre))
                m_coordFieldStr.setX((m_sizeWgt.width() - m_sizeFieldStr.width())/2);
    
    if((m_posField & posTop))
        m_coordFieldStr.setY(0);
    else
        if((m_posField & posBottom))
            m_coordFieldStr.setY(m_sizeWgt.height() - m_sizeFieldStr.height());
        else
            if((m_posField & posVCentre))
                m_coordFieldStr.setY((m_sizeWgt.height() - m_sizeFieldStr.height())/2);

    // установка координат строки
    if(m_dirStr == dirLeft)
        m_coordStr.setX(-m_sizeStr.width());
    else
        if(m_dirStr == dirRight)
            m_coordStr.setX(m_sizeFieldStr.width());

    //m_coordStr.setX(0); // позиция для проверки работы строки

    m_coordStr.setY((m_sizeFieldStr.height()/4)*3);
}
//----------------------------------------------------------------------
void RunStr::run()
{
    this->setFont(m_font);
    QPalette palette;
    palette.setColor(QPalette::WindowText, m_color);
    this->setPalette(palette);

    setSize();

    this->setGeometry(m_coordFieldStr.x(), m_coordFieldStr.y(), m_coordFieldStr.x() + m_sizeFieldStr.width(), m_coordFieldStr.y() + m_sizeFieldStr.height());

    m_timer = new QTimer;
    m_timer->start(30);

    connect(m_timer, SIGNAL(timeout()), this, SLOT(slotTimer()));
}
//----------------------------------------------------------------------
void RunStr::slotTimer()
{
    int cx;
    if(m_dirStr == dirLeft)
    {
        if(m_coordStr.x() >= m_sizeFieldStr.width())
        {
            m_coordStr.setX(-m_sizeStr.width());
            return;
        }

        cx = m_coordStr.x();
        m_coordStr.setX(++cx);
    }
    else
        if(m_dirStr == dirRight)
        {
            if(m_coordStr.x() <= -m_sizeStr.width())
            {
                m_coordStr.setX(m_sizeFieldStr.width());
                return;
            }

            cx = m_coordStr.x();
            m_coordStr.setX(--cx);
        }

    this->update();
}
//--------------------------------------------------------------------------
void RunStr::setColor(QColor color)
{
    m_color = color;
}
//--------------------------------------------------------------------------
void RunStr::setFontStr(const QFont &font)
{
    m_font = font;
}


Автор: _GRIN_ 28.3.2011, 15:26
vlarry, велосипед уже изобретён =)
 http://qt-apps.org/content/show.php/MarqueeLabel?content=113690

З.Ы. тебе нужен класс WidgetMarqueeLabel (он в папке src - cоответственно хидер и сишник)

Автор: vlarry 28.3.2011, 15:35
спасибо, setClipRect помог...Есть еще один вопрос, чтобы не плодить темы задам его здесь. Как узнать в QLabel, что у QWidget изменились размеры, без наследования QWidget...сигналов не нашел...

Автор: borisbn 28.3.2011, 15:41
Цитата(vlarry @  28.3.2011,  15:35 Найти цитируемый пост)
Как узнать в QLabel, что у QWidget изменились размеры

Если в наследнике от QLable, то переписываешь виртуальную ф-цию 
Цитата

void QWidget::resizeEvent ( QResizeEvent * event )   [virtual protected]

если без наследования, тогда
Цитата

void QObject::installEventFilter ( QObject * filterObj )


Добавлено через 1 минуту и 13 секунд
Если же ты хочешь изменять свои размеры пропорционально размером "родительской" формы, то лучше юзать layout'ы

Автор: vlarry 28.3.2011, 15:52
спасибо буду пробовать void QObject::installEventFilter ( QObject * filterObj )

Автор: vlarry 28.3.2011, 16:41
всем спасибо все работает....

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)