Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Mixolap от Сентябрь 22, 2008, 21:41



Название: Бегущий текст
Отправлено: Mixolap от Сентябрь 22, 2008, 21:41
Посоветуйте виджет для отображения бегущего текста.


Название: Re: Бегущий текст
Отправлено: ритт от Сентябрь 22, 2008, 22:06
QWidget :)


Название: Re: Бегущий текст
Отправлено: niXman от Сентябрь 22, 2008, 23:51
Унаследуйся от QLineEdit или QLabel, и QThread перегрузи виртуальную функцию run() и в ней реализуй алгоритм бегущей строки.
Код:
class MyLabel: public QLabel, public QThread {
   Q_OBJECT
public:
   MyLabel(QWidget* p = 0):QLabel(p),QThread(p) {}
   ...
   void run() {
   ... // Тут алгоритм бегущей строки.
   }
};
Алгоритмов бегущей строки много. Один из вариантов - на основе очереди.
Удачи.


Название: Re: Бегущий текст
Отправлено: ритт от Сентябрь 23, 2008, 00:32
Код:
class MyLabel: public QLabel, public QThread {
   Q_OBJECT

и что, скомпилится?


Название: Re: Бегущий текст
Отправлено: vaprele07 от Сентябрь 23, 2008, 03:37
тред на бегущую строку жестоко)))
примеры рулят: http://doc.trolltech.com/4.1/widgets-wiggly.html


Название: Re: Бегущий текст
Отправлено: pastor от Сентябрь 23, 2008, 14:26
Код:
class MyLabel: public QLabel, public QThread {
   Q_OBJECT

и что, скомпилится?

В Qt3 да, и даже будет работать ;)


Название: Re: Бегущий текст
Отправлено: Mixolap от Сентябрь 23, 2008, 17:34
Ага, спасибо, сделаю через QLabel и QTimer  ;)
Получится бегущая строка с новостями rss.


Название: Re: Бегущий текст
Отправлено: ритт от Сентябрь 23, 2008, 19:50
Код:
class MyLabel: public QLabel, public QThread {
   Q_OBJECT

и что, скомпилится?

В Qt3 да, и даже будет работать ;)

у него в подписи "qt-4.4.2 opensource" ^_^


Название: Re: Бегущий текст
Отправлено: niXman от Сентябрь 23, 2008, 21:34
Код:
class MyLabel: public QLabel, public QThread {
   Q_OBJECT

и что, скомпилится?

В Qt3 да, и даже будет работать ;)

у него в подписи "qt-4.4.2 opensource" ^_^
Не понял прикола...


Название: Re: Бегущий текст
Отправлено: ритт от Сентябрь 23, 2008, 21:46
гцц говорит что-то вроде
Цитировать
Warning: Class MyLabel inherits from two QObject subclasses QLabel and QThread. This is not supported!
не знаю будет ли работать - не проверял...да и гуёвые объекты должны быть в одном потоке, насколько я помню.


Название: Re: Бегущий текст
Отправлено: kirill от Сентябрь 25, 2008, 05:40
да и гуёвые объекты должны быть в одном потоке, насколько я помню.

Создаваться - да, управляться - нет. Отдай в поток адрес виджета и рули им.


Название: Re: Бегущий текст
Отправлено: ритт от Сентябрь 25, 2008, 07:10
и шо, без синхронизации с основным потоком прямо вот так по указателю и рулить?


Название: Re: Бегущий текст
Отправлено: pastor от Сентябрь 25, 2008, 12:24
Создаваться - да, управляться - нет. Отдай в поток адрес виджета и рули им.

...и твое приложение вывалиться в кору

ЗЫ: Все операции с гуем должны быть ТОЛЬКО в гуевом потоке!


Название: Re: Бегущий текст
Отправлено: Mixolap от Сентябрь 25, 2008, 20:32
Обошелся без QTimer (хватило встроенного в QObject).
Просьба покритиковать:
http://qtfaq.ru/tiki-index.php?page=runline


Название: Re: Бегущий текст
Отправлено: Karl-Philipp от Сентябрь 26, 2008, 00:30
Обошелся без QTimer (хватило встроенного в QObject).
Просьба покритиковать:
http://qtfaq.ru/tiki-index.php?page=runline
тестировал на Celeron 1.1, встроенное видео:
Результат:
Строчка "бежит" с некими задержками на любой скорости прокрутки (может так и надо - не знаю), но больше всего напрягает неравномерность задержек по длительности. Текст будто притормаживает в определенные промежутки.
А вобще интересная идея


Название: Re: Бегущий текст
Отправлено: kirill от Сентябрь 26, 2008, 06:14
Тоже тормоза.
Имхо, надо делать как WigglyWidget из демонстрашек.

Переопределять paintEvent и использовать QPainter.
Код:
QPainter painter(this);
     for (int i = 0; i < text.size(); ++i) {
         int index = (step + i) % 16;
         color.setHsv((15 - index) * 16, 255, 191);
         painter.setPen(color);
         painter.drawText(x, y - ((sineTable[index] * metrics.height()) / 400),
                          QString(text[i]));
         x += metrics.width(text[i]);
     }


Название: Re: Бегущий текст
Отправлено: Mixolap от Сентябрь 26, 2008, 13:28
да, тоже замечаю у себя иногда. мож таймер неточный в QObject...


Название: Re: Бегущий текст
Отправлено: m_ax от Сентябрь 26, 2008, 13:45
Уха ха ха...
Ну что это за фигня, господа?
Код:
C:\TestQt\runline>make
mingw32-make -f Makefile.Release
mingw32-make[1]: Entering directory `C:/TestQt/runline'
g++ -c -O2 -O2 -frtti -Wall -fno-exceptions -DUNICODE -DQT_LARGEFILE_SUPPORT -DQ
T_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -DQT_NEEDS_QMAIN -I"C:
/Qt/4.1.1/include/QtCore" -I"C:/Qt/4.1.1/include/QtGui" -I"C:/Qt/4.1.1/include"
-I"." -I"C:/Qt/4.1.1/include/ActiveQt" -I"release" -I"." -I"C:/Qt/4.1.1/mkspecs/
win32-g++" -o release\main.o main.cpp
main.cpp: In function `int qMain(int, char**)':
main.cpp:10: error: `trUtf8' undeclared (first use this function)
main.cpp:10: error: (Each undeclared identifier is reported only once for each f
unction it appears in.)
mingw32-make[1]: *** [release\main.o] Error 1
mingw32-make[1]: Leaving directory `C:/TestQt/runline'
mingw32-make: *** [release] Error 2

C:\TestQt\runline>


Название: Re: Бегущий текст
Отправлено: ритт от Сентябрь 26, 2008, 14:08
Цитировать
QString QObject::trUtf8 ( const char * sourceText, const char * comment = 0, int n = -1 )   [static]


Название: Re: Бегущий текст
Отправлено: m_ax от Сентябрь 26, 2008, 14:35
День добрый!
У меня Ваш виджет не компилится по причине отсутствия в версии 4.1.1 функции setOpenExternalLinks(bool) в QLabel

 :(


Название: Re: Бегущий текст
Отправлено: ритт от Сентябрь 26, 2008, 21:48
на улице уже 2008 год (подходит к завершению), тролльтехи уже выпустили 4.4.2 и готовят 4.5.0. не пора ли обновиться? :)


Название: Re: Бегущий текст
Отправлено: Mixolap от Сентябрь 28, 2008, 11:23
Опять инопланетяне не виноваты. Эффект торможения удалось устранить обрабатывая начальный пробел в строке (пропуская его).

Цитировать
Переопределять paintEvent и использовать QPainter.
Так, думаю, была бы возможность выводить текст плавнее, но что тогда делать с html форматированием?


Название: Re: Бегущий текст
Отправлено: ритт от Сентябрь 28, 2008, 12:53
как я и советовал ещё в самом начале, возьми QWidget, переопредели его paintEvent и рисуй плавненько. анимацию вообще можно рассчитывать в отдельном потоке и оптимизировать всё это дело так, что скорость/нагрузка от рисования самого QWidget не будет заметно отличаться (например, ввести спящий режим потока, когда виджет скрыт, и т.п.)
для html-форматирования подсмотри код QLabel. можно оставить лишь html-форматирование _текста_, т.к. картинки и html-ссылки в тексте тебе не нужны (вряд ли кто будет гоняться за убегающей ссылкой), а вот QUrl как отдельное свойство (+сеттер/геттер) было бы уместно - можно было бы из этого виджета подобие баннера делать (или просто информативную кнопку)...да и вообще, область использования такого виджета заметно расширится.

если у тебя всё получится, можно было бы опубликовать данный виджет под жпл - пущай народ балуется :)


Название: Re: Бегущий текст
Отправлено: Sergeich от Сентябрь 28, 2008, 14:35
Цитировать
Переопределять paintEvent и использовать QPainter.
Так, думаю, была бы возможность выводить текст плавнее, но что тогда делать с html форматированием?
QTextDocument::drawContents метод поможет тебе


Название: Re: Бегущий текст
Отправлено: lit-uriy от Сентябрь 28, 2008, 14:38
html-ссылки в тексте тебе не нужны (вряд ли кто будет гоняться за убегающей ссылкой)
а у него при наведении мыша текст останавливается.


Название: Re: Бегущий текст
Отправлено: Mixolap от Сентябрь 28, 2008, 16:31
html-ссылки мне как раз и нужны. Для показа ленты новостей виджет разрабатывал (типа rss).


Название: Re: Бегущий текст
Отправлено: niXman от Январь 11, 2009, 11:00
Уухх... Понаписывали со времени моего последнего визита! )))) Респект и уважуха!!! Да, с наследованием я погорячился...
Кто-то, покажите что получилось?