Поиск:

Ответ в темуСоздание новой темы Создание опроса
> бегущая строка 
V
    Опции темы
vlarry
Дата 28.3.2011, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

Репутация: нет
Всего: нет



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

PM MAIL   Вверх
bsa
Дата 28.3.2011, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



QPainter::setClipRect использовать пробовал?
PM   Вверх
borisbn
Дата 28.3.2011, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



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

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


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
vlarry
Дата 28.3.2011, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

Репутация: нет
Всего: нет



Цитата(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;
}


PM MAIL   Вверх
_GRIN_
Дата 28.3.2011, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 18.11.2007
Где: Калуга

Репутация: 6
Всего: 7



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

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

Это сообщение отредактировал(а) _GRIN_ - 28.3.2011, 15:29


--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
vlarry
Дата 28.3.2011, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

Репутация: нет
Всего: нет



спасибо, setClipRect помог...Есть еще один вопрос, чтобы не плодить темы задам его здесь. Как узнать в QLabel, что у QWidget изменились размеры, без наследования QWidget...сигналов не нашел...
PM MAIL   Вверх
borisbn
Дата 28.3.2011, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



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

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

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

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

void QObject::installEventFilter ( QObject * filterObj )


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


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
vlarry
Дата 28.3.2011, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

Репутация: нет
Всего: нет



спасибо буду пробовать void QObject::installEventFilter ( QObject * filterObj )
PM MAIL   Вверх
vlarry
Дата 28.3.2011, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

Репутация: нет
Всего: нет



всем спасибо все работает....

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1243 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.