Название: Бегущая строка
Отправлено: Larry от Март 28, 2011, 12:53
Добрый день, форумчане! Подскажите пожалуйста по такому вопросу. Я реализую бегущую строку в QLabel. Все работает, но с правой стороны от QLabel видно ту часть строки, которая находится за пределами. С левой такого не наблюдается. Что это может быть. QLabel расположена на QWidget.
Название: Re: Бегущая строка
Отправлено: merke от Март 28, 2011, 12:55
Код выкладывай...
Название: Re: Бегущая строка
Отправлено: Larry от Март 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; } хедер выкладывать?
Название: Re: Бегущая строка
Отправлено: Larry от Март 28, 2011, 14:01
ни у кого ни каких вариантов нет? Жаль... есть еще один вопрос: как узнать в QLabel, что QWidget изменил размеры без наследования QWidget....
Название: Re: Бегущая строка
Отправлено: Larry от Март 28, 2011, 15:37
спасибо всем отозвавшимся, все уже заработало. Помог setClipRect()...
|