Russian Qt Forum
Сентябрь 29, 2024, 16:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Бегущая строка  (Прочитано 3385 раз)
Larry
Гость
« : Март 28, 2011, 12:53 »

Добрый день, форумчане! Подскажите пожалуйста по такому вопросу. Я реализую бегущую строку в QLabel. Все работает, но с правой стороны от QLabel видно ту часть строки, которая находится за пределами. С левой такого не наблюдается. Что это может быть. QLabel расположена на QWidget.
Записан
merke
Гость
« Ответ #1 : Март 28, 2011, 12:55 »

Код выкладывай...
Записан
Larry
Гость
« Ответ #2 : Март 28, 2011, 13:01 »

Код:
#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;
}
хедер выкладывать?
Записан
Larry
Гость
« Ответ #3 : Март 28, 2011, 14:01 »

ни у кого ни каких вариантов нет? Жаль...
есть еще один вопрос: как узнать в QLabel, что QWidget изменил размеры без наследования QWidget....
Записан
Larry
Гость
« Ответ #4 : Март 28, 2011, 15:37 »

спасибо всем отозвавшимся, все уже заработало. Помог setClipRect()...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.053 секунд. Запросов: 21.