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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Редактор текста с постраничным выводом а-ля Word  (Прочитано 13369 раз)
UNION labs
Гость
« : Апрель 30, 2014, 17:39 »

Всем привет.

Нужен такой текстовый редактор, который может работать с QTextDocument и в то же время отображать текст не сплошняком, как обычный QTextEdit, а по страницам, на подобии ворда. Может быть вам попадался такой компонент? Если нет, подскажите пожалуйста, как бы вы стали реализовывать таковой?
« Последнее редактирование: Май 19, 2014, 14:25 от dimkanovikov » Записан
Hrundel
Гость
« Ответ #1 : Май 01, 2014, 11:47 »

QGraphicsScene и там рисовать страницы с текстом.

Подробнее можно прочесть у

Марк Саммерфилд
Qt. Профессиональное программирование
Разработка кроссплатформенных приложений на С++

Начиная с главы 9 и до конца книги
Записан
_OLEGator_
Гость
« Ответ #2 : Май 01, 2014, 13:03 »

Судя по документации, у QTextDocument есть весь необходимый функционал:
Код
C++ (Qt)
void setPageSize ( const QSizeF & size )
void QTextDocument::drawContents ( QPainter * p, const QRectF & rect = QRectF() )
Записан
Hrundel
Гость
« Ответ #3 : Май 01, 2014, 14:17 »

Судя по документации, у QTextDocument есть весь необходимый функционал:

Круто, я тоже не знал. Даже Layout блоками возможен.
Записан
UNION labs
Гость
« Ответ #4 : Май 02, 2014, 17:18 »

Спасибо, сделал. Если кому-нибудь будет интересно, вот исходники - https://github.com/dimkanovikov/QPagesTextEdit
Записан
kai666_73
Крякер
****
Offline Offline

Сообщений: 319


Просмотр профиля
« Ответ #5 : Май 05, 2014, 14:47 »

Спасибо, сделал. Если кому-нибудь будет интересно, вот исходники - https://github.com/dimkanovikov/QPagesTextEdit

Вау, спасибо за идею.
Воспользовался с небольшой корректировкой (размер документа задаю в пикселях).

Было бы совсем идеально, если бы можно было "дорастянуть" последнюю страницу до полного размера страницы.
Тогда можно было добавить футеры/хидеры.
Если у кого есть мысли на этот счет, был бы крайне признателен.
Записан
UNION labs
Гость
« Ответ #6 : Май 15, 2014, 05:26 »

kai666_73, пожалуйста. Почему не выложили свой патч?Улыбающийся

Мне тоже понадобится данный функционал в будущем, пока просто руки не дошли, т.к. не критично. А кроме этого нужно ещё задание размера страницы в мм, и задание отступов от текста со всех четырёх сторон (т.к. QTextDocument не позволяет задать отступ для каждой стороны).
Записан
kai666_73
Крякер
****
Offline Offline

Сообщений: 319


Просмотр профиля
« Ответ #7 : Май 15, 2014, 15:37 »

kai666_73, пожалуйста. Почему не выложили свой патч?Улыбающийся

Мне тоже понадобится данный функционал в будущем, пока просто руки не дошли, т.к. не критично. А кроме этого нужно ещё задание размера страницы в мм, и задание отступов от текста со всех четырёх сторон (т.к. QTextDocument не позволяет задать отступ для каждой стороны).

Пока в процессе...
Сделаны настройки:
1. Формата страницы (А3, А4...)
2. Отступов с краев... разные отступы задаются установкой свойств QTextFrameFormat для rootFrame документа
3. Хидеров и футеров
4. Отображение последней страницы целиком

... Выложить проблематично - все это уже вылилось в десяток файло-классов. Из Вашей репы взята, почитай, только идея Строит глазки
Будут конкретные вопросы - обращайтесь, про отступы, вроде, уже ответил.
« Последнее редактирование: Май 15, 2014, 15:40 от kai666_73 » Записан
UNION labs
Гость
« Ответ #8 : Май 16, 2014, 06:11 »

Хорошо, спасибо, в ближайшем будущем обращусь. А вы не собираетесь выкладывать проект в общий доступ? Может быть просто оставили бы ссылку?
Записан
kai666_73
Крякер
****
Offline Offline

Сообщений: 319


Просмотр профиля
« Ответ #9 : Май 16, 2014, 10:47 »

Хорошо, спасибо, в ближайшем будущем обращусь. А вы не собираетесь выкладывать проект в общий доступ? Может быть просто оставили бы ссылку?

Планирую реализовать дизайнер отчетов на базе QTextEdit-а.
Возникла такая необходимость - заказ военных. Так что об общем доступе речи быть не может ((
Записан
UNION labs
Гость
« Ответ #10 : Май 19, 2014, 10:01 »

Ясно, ну тогда расскажите пожалуйста, как вы:
1. сделали задание размера страницы в миллиметрах?
2. дорисовываете страницу?
Записан
kai666_73
Крякер
****
Offline Offline

Сообщений: 319


Просмотр профиля
« Ответ #11 : Май 19, 2014, 10:52 »

Ясно, ну тогда расскажите пожалуйста, как вы:
1. сделали задание размера страницы в миллиметрах?
2. дорисовываете страницу?

1. Реализовал такой вот класс:
PageFormat.h
Код:
class PageFormat
{
public:
    PageFormat( QPaintDevice *device,
                const QString &format = "A4",
                bool  isPortrait = true,
                qreal mmLeftMargin = 15.0,
                qreal mmTopMargin = 15.0,
                qreal mmRightMargin = 15.0,
                qreal mmBottomMargin = 15.0 );

    void update( const QString &format = "A4",
                 bool  isPortrait = true,
                 qreal mmLeftMargin = 15.0,
                 qreal mmTopMargin = 15.0,
                 qreal mmRightMargin = 15.0,
                 qreal mmBottomMargin = 15.0 );

    void update( int   formatId,
                 bool  isPortrait = true,
                 qreal mmLeftMargin = 15.0,
                 qreal mmTopMargin = 15.0,
                 qreal mmRightMargin = 15.0,
                 qreal mmBottomMargin = 15.0 );

    inline qreal leftMargin() const { return m_leftMargin; }
    inline qreal topMargin() const { return m_topMargin; }
    inline qreal rightMargin() const { return m_rightMargin; }
    inline qreal bottomMargin() const { return m_bottomMargin; }

    inline qreal paperWidth() const { return m_paperWidth; }
    inline qreal pageWidth() const { return m_pageWidth; }
    inline qreal paperHeight() const { return m_paperHeight; }
    inline qreal pageHeight() const { return m_pageHeight; }

    inline int formatId() const { return m_formatId; }
    inline bool isPortrait() const { return m_isPortrait; }

    inline qreal mmLeftMargin() const { return m_mmLeftMargin; }
    inline qreal mmTopMargin() const { return m_mmTopMargin; }
    inline qreal mmRightMargin() const { return m_mmRightMargin; }
    inline qreal mmBottomMargin() const { return m_mmBottomMargin; }

    static QSizeF sizeForFormatId( int formatId, bool isPortrait );

private:
    QString m_format;       // Name of Page Format <=> QPrinter::PaperSize ("A4 (default), "Letter", "B5"...)
    bool m_isPortrait;     // true for Portrait Orientation

    qreal m_mmLeftMargin;   // Left Margin in mm
    qreal m_mmTopMargin;    // Top Margin in mm
    qreal m_mmRightMargin;  // Right Margin in mm
    qreal m_mmBottomMargin; // Right Margin in mm

    qreal m_leftMargin;     // Left Margin in px
    qreal m_topMargin;      // Top Margin in px
    qreal m_rightMargin;    // Right Margin in px
    qreal m_bottomMargin;   // Right Margin in px

    qreal m_paperWidth;     // Paper Width in px
    qreal m_pageWidth;      // Page Width in px (m_paperWidth - m_leftMargin - m_rightMargin)
    qreal m_paperHeight;    // Paper Height in px
    qreal m_pageHeight;     // Page Height in px (m_paperHeight - m_topMargin - m_bottomMargin)

    QPaintDevice *m_device;
    int m_formatId;
};

PageFormat.cpp
Код:
static inline double mmToInches(double mm) { return mm * 0.039370147; }

typedef struct tagPageFormatSize {
    QString formatName;
    qreal   wmm;
    qreal   hmm;
} PageFormatSize;

static PageFormatSize formats[30] = {
    {        "A0",  841.0, 1189.0 },
    {        "A1",  594.0,  841.0 },
    {        "A2",  420.0,  594.0 },
    {        "A3",  297.0,  420.0 },
    {        "A4",  210.0,  297.0 },
    {        "A5",  148.0,  210.0 },
    {        "A6",  105.0,  148.0 },
    {        "A7",   74.0,  105.0 },
    {        "A8",   52.0,   74.0 },
    {        "A9",   37.0,   52.0 },
    {        "B0", 1030.0, 1456.0 },
    {        "B1",  728.0, 1030.0 },
    {        "B2",  515.0,  728.0 },
    {        "B3",  364.0,  515.0 },
    {        "B4",  257.0,  364.0 },
    {        "B5",  182.0,  257.0 },
    {        "B6",  128.0,  182.0 },
    {        "B7",   91.0,  128.0 },
    {        "B8",   64.0,   91.0 },
    {        "B9",   45.0,   64.0 },
    {       "B10",   32.0,   45.0 },
    {       "C5E",  163.0,  229.0 },
    {   "Comm10E",  105.0,  241.0 },
    {       "DLE",  110.0,  220.0 },
    { "Executive",  191.0,  254.0 },
    {     "Folio",  210.0,  330.0 },
    {    "Ledger",  432.0,  279.0 },
    {     "Legal",  216.0,  356.0 },
    {    "Letter",  216.0,  279.0 },
    {   "Tabloid",  279.0,  432.0 }
};

static QSizeF sizeForPageFormat( const QString &format, bool isPortrait, int &formatId )
{
    for (int i = 0; i < 30; i++)
        if ( !format.compare(formats[i].formatName, Qt::CaseInsensitive) ) {
            formatId = i;
            return isPortrait ? QSizeF(formats[i].wmm, formats[i].hmm) : QSizeF(formats[i].hmm, formats[i].wmm);
        }

    formatId = 4;
    return isPortrait ? QSizeF(210.0, 297.0) : QSizeF(297.0, 210.0);
}

PageFormat::PageFormat( QPaintDevice *device,
                        const QString &format,
                        bool  isPortrait,
                        qreal mmLeftMargin,
                        qreal mmTopMargin,
                        qreal mmRightMargin,
                        qreal mmBottomMargin )
    : m_device(device)
{
    update(format, isPortrait, mmLeftMargin, mmTopMargin, mmRightMargin, mmBottomMargin);
}

void PageFormat::update( const QString &format,
                         bool  isPortrait,
                         qreal mmLeftMargin,
                         qreal mmTopMargin,
                         qreal mmRightMargin,
                         qreal mmBottomMargin )
{
    m_format = format;
    m_isPortrait = isPortrait;

    m_mmLeftMargin = mmLeftMargin;
    m_mmTopMargin = mmTopMargin;
    m_mmRightMargin = mmRightMargin;
    m_mmBottomMargin = mmBottomMargin;

    QSizeF mmSize = sizeForPageFormat(m_format, m_isPortrait, m_formatId);
    m_pageWidth = mmSize.width() - mmLeftMargin - mmRightMargin;
    m_pageHeight = mmSize.height() - mmTopMargin - mmBottomMargin;

    m_paperWidth = mmToInches(m_paperWidth) * m_device->logicalDpiX();
    m_pageWidth = mmToInches(m_pageWidth) * m_device->logicalDpiX();
    m_leftMargin = mmToInches(m_leftMargin) * m_device->logicalDpiX();
    m_rightMargin = mmToInches(m_rightMargin) * m_device->logicalDpiX();

    m_paperHeight = mmToInches(m_paperHeight) * m_device->logicalDpiY();
    m_pageHeight = mmToInches(m_pageHeight) * m_device->logicalDpiY();
    m_topMargin = mmToInches(m_topMargin) * m_device->logicalDpiY();
    m_bottomMargin = mmToInches(m_bottomMargin) * m_device->logicalDpiY();
}

void PageFormat::update( int formatId, bool isPortrait, qreal mmLeftMargin, qreal mmTopMargin, qreal mmRightMargin, qreal mmBottomMargin )
{
    m_format = formats[formatId].formatName;
    m_isPortrait = isPortrait;
    m_formatId = formatId;

    m_mmLeftMargin = mmLeftMargin;
    m_mmTopMargin = mmTopMargin;
    m_mmRightMargin = mmRightMargin;
    m_mmBottomMargin = mmBottomMargin;

    if ( isPortrait ) {
        m_paperWidth  = formats[formatId].wmm;
        m_paperHeight = formats[formatId].hmm;
    }
    else {
        m_paperHeight = formats[formatId].wmm;
        m_paperWidth  = formats[formatId].hmm;
    }

    m_pageWidth = m_paperWidth - mmLeftMargin - mmRightMargin;
    m_pageHeight = m_paperHeight - mmTopMargin - mmBottomMargin;

    m_paperWidth = mmToInches(m_paperWidth) * m_device->logicalDpiX();
    m_pageWidth = mmToInches(m_pageWidth) * m_device->logicalDpiX();
    m_leftMargin = mmToInches(m_leftMargin) * m_device->logicalDpiX();
    m_rightMargin = mmToInches(m_rightMargin) * m_device->logicalDpiX();

    m_paperHeight = mmToInches(m_paperHeight) * m_device->logicalDpiY();
    m_pageHeight = mmToInches(m_pageHeight) * m_device->logicalDpiY();
    m_topMargin = mmToInches(m_topMargin) * m_device->logicalDpiY();
    m_bottomMargin = mmToInches(m_bottomMargin) * m_device->logicalDpiY();
}

QSizeF PageFormat::sizeForFormatId( int formatId, bool isPortrait )
{
    if ( isPortrait )
        return QSizeF( formats[formatId].wmm, formats[formatId].hmm );

    return QSizeF( formats[formatId].hmm, formats[formatId].wmm );
}

2. В функции рисования едитора (в постраничном режиме) изменил диапазон вертикального скролбара
Код:
verticalScrollBar()->setRange(0, m_drawPageSize.height() * (document()->pageCount()) - viewport()->size().height());
Записан
UNION labs
Гость
« Ответ #12 : Май 19, 2014, 14:25 »

Примного благодарен!
Записан
_OLEGator_
Гость
« Ответ #13 : Май 19, 2014, 22:57 »

Код
C++ (Qt)
qreal mmLeftMargin
qreal mmTopMargin
qreal mmRightMargin
qreal mmBottomMargin

Напрашивается как минимум на выделение в структуру.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #14 : Май 20, 2014, 00:00 »

Код
C++ (Qt)
qreal mmLeftMargin
qreal mmTopMargin
qreal mmRightMargin
qreal mmBottomMargin

Напрашивается как минимум на выделение в структуру.

Или просто использовать для этого класс QMargins Строит глазки
Записан

Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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