crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Вращение текста в графическом представлении, QGraphicsItem и drawText
r485_post
  опции профиля:
сообщение 31.7.2009, 13:59
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 31.7.2009
Пользователь №: 970

Спасибо сказали: 0 раз(а)




Репутация:   0  


Хочу спросить еще про функцию drawText следующее:

в классе QGraphicsItem переопределяю метод paint

painter->rotate(изменяемый во времени угол);
painter->drawText(-100, -100, "Текстовая строка");

Т.е. пользователь видит как с некой скоростью на экране поворачивается строка. Но буквы в самой строке при этом пляшут относительно друг друга как живые. Смотреть на эти танцы невозможно. Если повернуть, нарисовать и оставить - все прекрасно. Но как только динамически начинаешь крутить строку, происходит "ЭТО". Похоже на автоформатирование текста по ширине.

Кто сталкивался с таким? Как это убрать?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ufna
  опции профиля:
сообщение 31.7.2009, 14:07
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 362
Регистрация: 24.5.2008
Из: Курган/СПб
Пользователь №: 182

Спасибо сказали: 29 раз(а)




Репутация:   5  


подожди, ты рисуешь каждый раз из разных мест, получается. Точка (-100, -100) каждый раз реально находится в совершенно разных местах, т.к. она считается в уже повернутой системе координат.

тебе нужно
painter->translate(-100, -100);
painter->rotate(...);
painter->drawText(0, 0, "vot ono");


Сообщение отредактировал Litkevich Yuriy - 31.7.2009, 18:05
Причина редактирования: используй тэг code
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
r485_post
  опции профиля:
сообщение 31.7.2009, 14:29
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 31.7.2009
Пользователь №: 970

Спасибо сказали: 0 раз(а)




Репутация:   0  


я именно это и делаю. Каждый раз при новом повороте текст будет в новой точке. Например я поворачиваю шкалу. Текст будет вращаться по окружности (а не относительно точки). Но проблема не в этом, а в том что внутри текста буквы дергаются отсительно друг друга.



На это нужно посмотреть. Создай итем и добавь в графиксвью. А потом по таймеру покрути текст. Займет несколько минут.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 31.7.2009, 14:40
Сообщение #4


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Цитата(r485_post @ 31.7.2009, 15:29) *
На это нужно посмотреть. Создай итем и добавь в графиксвью. А потом по таймеру покрути текст. Займет несколько минут.

выложи свой код, займет меньше времени.

Сообщение отредактировал kwisp - 31.7.2009, 14:40
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
r485_post
  опции профиля:
сообщение 31.7.2009, 15:11
Сообщение #5


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 31.7.2009
Пользователь №: 970

Спасибо сказали: 0 раз(а)




Репутация:   0  


Вот набросал наглядный пример, но не могу загрузить (пишет " Неудачная загрузка. Вам запрещено загружать такой тип файлов").

А насчет новой темы я непротив. Просто тема называлась обощенно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 31.7.2009, 15:17
Сообщение #6


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


r485_post,
ну так выложи код не забудь только его експанд сделать, я не помню может тебе еще нельзя файлы выгружать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
r485_post
  опции профиля:
сообщение 31.7.2009, 15:29
Сообщение #7


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 31.7.2009
Пользователь №: 970

Спасибо сказали: 0 раз(а)




Репутация:   0  


rotate.pro

# -------------------------------------------------
# Project created by QtCreator 2009-07-31T14:38:53
# -------------------------------------------------
TARGET = rotate
TEMPLATE = app
SOURCES += main.cpp \
    mainwindow.cpp \
    item.cpp
HEADERS += mainwindow.h \
    item.h
FORMS += mainwindow.ui
item.cpp
#include "item.h"
#include <QPainter>

item::item()
{
    angle = 0;

    timer.start(20);
    connect(&timer, SIGNAL(timeout()), this, SLOT(rotateText()));

}

QRectF item::boundingRect() const
{
    return QRectF(-514.0/2.0, -514.0/2.0, 514.0, 514.0);
}

void item::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    // Включаем Antialiasing
    painter->setRenderHint(QPainter::Antialiasing, true);

    // Определяем инструменты рисования
    QPen    Pen(Qt::blue, 2, Qt::SolidLine, Qt::SquareCap, Qt::MiterJoin);
    QBrush  Brush(Qt::black, Qt::SolidPattern);
    QFont   Font("Times", 19, 100);

    // Настраиваем инструменты рисования
    painter->setPen(Pen);
    painter->setBrush(Brush);
    painter->setFont(Font);

    painter->rotate(angle);
    painter->drawText(-100, -100, "Text string 123");
}

QPainterPath item::shape() const
{
    QPainterPath path;

    path.addEllipse(205.0, -45.0, 100.0, 90.0);

    return path;
}

void item::rotateText()
{
    angle += 0.1;
    update();
}
item.h
#ifndef ITEM_H
#define ITEM_H

#include <QtGui/QGraphicsItem>
#include <QObject>
#include <QTimer>

class item : public QObject,  public QGraphicsItem
{
Q_OBJECT

public:
    item();

     QRectF boundingRect() const;
     QPainterPath shape() const;
     void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
                QWidget *widget);
private:
     QTimer timer;
     double angle;

private slots:
     void rotateText();
};

#endif // ITEM_H
main.cpp
#include <QtGui/QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainWindowClass)
{
    ui->setupUi(this);

    scene = new QGraphicsScene;
    i = new item;

    scene->addItem(i);
    ui->graphicsView->setScene(scene);
}

MainWindow::~MainWindow()
{
    delete ui;
}
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui/QMainWindow>
#include <QGraphicsScene>
#include "item.h"

namespace Ui
{
    class MainWindowClass;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindowClass *ui;
    QGraphicsScene* scene;
    item* i;
};

#endif // MAINWINDOW_H
mainwindow.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindowClass</class>
<widget class="QMainWindow" name="MainWindowClass">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>600</width>
    <height>400</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralWidget">
   <widget class="QGraphicsView" name="graphicsView">
    <property name="geometry">
     <rect>
      <x>20</x>
      <y>30</y>
      <width>451</width>
      <height>331</height>
     </rect>
    </property>
    <property name="renderHints">
     <set>QPainter::Antialiasing|QPainter::SmoothPixmapTransform|QPainter::TextAntialia
sing</set>
    </property>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menuBar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>600</width>
     <height>19</height>
    </rect>
   </property>
  </widget>
  <widget class="QToolBar" name="mainToolBar">
   <attribute name="toolBarArea">
    <enum>TopToolBarArea</enum>
   </attribute>
   <attribute name="toolBarBreak">
    <bool>false</bool>
   </attribute>
  </widget>
  <widget class="QStatusBar" name="statusBar"/>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources/>
<connections/>
</ui>
ui_mainwindow.h
/********************************************************************************
** Form generated from reading ui file 'mainwindow.ui'
**
** Created: Fri 31. Jul 15:00:16 2009
**      by: Qt User Interface Compiler version 4.5.0
**
** WARNING! All changes made in this file will be lost when recompiling ui file!
********************************************************************************/

#ifndef UI_MAINWINDOW_H
#define UI_MAINWINDOW_H

#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QGraphicsView>
#include <QtGui/QHeaderView>
#include <QtGui/QMainWindow>
#include <QtGui/QMenuBar>
#include <QtGui/QStatusBar>
#include <QtGui/QToolBar>
#include <QtGui/QWidget>

QT_BEGIN_NAMESPACE

class Ui_MainWindowClass
{
public:
    QWidget *centralWidget;
    QGraphicsView *graphicsView;
    QMenuBar *menuBar;
    QToolBar *mainToolBar;
    QStatusBar *statusBar;

    void setupUi(QMainWindow *MainWindowClass)
    {
        if (MainWindowClass->objectName().isEmpty())
            MainWindowClass->setObjectName(QString::fromUtf8("MainWindowClass"));
        MainWindowClass->resize(600, 400);
        centralWidget = new QWidget(MainWindowClass);
        centralWidget->setObjectName(QString::fromUtf8("centralWidget"));
        graphicsView = new QGraphicsView(centralWidget);
        graphicsView->setObjectName(QString::fromUtf8("graphicsView"));
        graphicsView->setGeometry(QRect(20, 30, 451, 331));
        graphicsView->setRenderHints(QPainter::Antialiasing|QPainter::SmoothPixmapTransform|QPainte
r::TextAntialiasing);
        MainWindowClass->setCentralWidget(centralWidget);
        menuBar = new QMenuBar(MainWindowClass);
        menuBar->setObjectName(QString::fromUtf8("menuBar"));
        menuBar->setGeometry(QRect(0, 0, 600, 19));
        MainWindowClass->setMenuBar(menuBar);
        mainToolBar = new QToolBar(MainWindowClass);
        mainToolBar->setObjectName(QString::fromUtf8("mainToolBar"));
        MainWindowClass->addToolBar(Qt::TopToolBarArea, mainToolBar);
        statusBar = new QStatusBar(MainWindowClass);
        statusBar->setObjectName(QString::fromUtf8("statusBar"));
        MainWindowClass->setStatusBar(statusBar);

        retranslateUi(MainWindowClass);

        QMetaObject::connectSlotsByName(MainWindowClass);
    } // setupUi

    void retranslateUi(QMainWindow *MainWindowClass)
    {
        MainWindowClass->setWindowTitle(QApplication::translate("MainWindowClass", "MainWindow", 0, QApplication::UnicodeUTF8));
        Q_UNUSED(MainWindowClass);
    } // retranslateUi

};

namespace Ui {
    class MainWindowClass: public Ui_MainWindowClass {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_MAINWINDOW_H


Сообщение отредактировал Litkevich Yuriy - 31.7.2009, 18:25
Причина редактирования: используй тэги code и expand
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 31.7.2009, 18:15
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


r485_post, См. Справка по кнопкам и тэгам форума
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
r485_post
  опции профиля:
сообщение 26.10.2009, 21:19
Сообщение #9


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 31.7.2009
Пользователь №: 970

Спасибо сказали: 0 раз(а)




Репутация:   0  


проблема дергающихся букв решена следующим образом:

     QFont   Font("Times", 19, 100);
     QPainterPath path;
     path.addText(0, 0, Font, "New text string 456");
     painter->fillPath(path, Qt::black);


функцию drawText не используем
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 26.12.2024, 16:48