Russian Qt Forum

Qt => Вопросы новичков => Тема начата: AndyKuvaldin от Март 20, 2012, 18:12



Название: drawText in QPainter
Отправлено: AndyKuvaldin от Март 20, 2012, 18:12
Вот код:

#include "mymain.h"
#include "ui_mymain.h"
#include "QFile.h"
#include "QString.h"
#include "QTextStream.h"
#include "QRect.h"
#include "QFont.h"
#include "QPainter.h"

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

    QString str;

    QPainter painter(this);
    QRect r = QRect(0, 0, 200, 200);
    painter.setFont(QFont("Times", 14, QFont::Normal));
    painter.drawRect(r);

    QFile myFile("readme.txt");
    if(!myFile.open(QIODevice::ReadOnly))
       return;
    QTextStream stream(&myFile);
    while (!stream.atEnd())
    {
      str = stream.readLine().toLocal8Bit();
      painter.drawText(r, Qt::AlignCenter | Qt::TextWordWrap, str);
    }
}

myMain::~myMain()
{
    delete ui;
}

Текст не отображается на форме. Смотрю в дебагере в переменной содержится то что надо вывести.
Помоги плз. Скажите в чем ошибка.


Название: Re: drawText in QPainter
Отправлено: mutineer от Март 20, 2012, 18:16
Рисовать надо в paintEvent()


Название: Re: drawText in QPainter
Отправлено: AndyKuvaldin от Март 20, 2012, 18:18
Мне надо не рисовать.
Мне надо отобразить текст на форме без использования стандартных отображателей текста...
то есть отобразить как картинку...


Название: Re: drawText in QPainter
Отправлено: kambala от Март 20, 2012, 18:19
это и означает "рисовать"


Название: Re: drawText in QPainter
Отправлено: mutineer от Март 20, 2012, 18:22
painter.drawText()
имя метода очень мягко намекает, что это тоже "рисовать"


Название: Re: drawText in QPainter
Отправлено: AndyKuvaldin от Март 20, 2012, 18:25
  QPixmap img1("ЧТО ТОГДА ПЕРЕДАВАТЬ СЮДА В ПУТЬ ДО ФАЙЛА?");
    painter.drawPixmap(0,0,img1);


Название: Re: drawText in QPainter
Отправлено: mutineer от Март 20, 2012, 18:27
  QPixmap img1("ЧТО ТОГДА ПЕРЕДАВАТЬ СЮДА В ПУТЬ ДО ФАЙЛА?");
    painter.drawPixmap(0,0,img1);

путь к файлу, который хочешь нарисовать?


Название: Re: drawText in QPainter
Отправлено: kambala от Март 20, 2012, 18:35
так а зачем рисовать QPixmap, если можно запомнить считанную строку и отобразить ее в paintEvent() через painter.drawText()? или ты думаешь, что QPixmap возьмет и сам прочитает текст из файла и сгенерирует для него картинку? :)


Название: Re: drawText in QPainter
Отправлено: AndyKuvaldin от Март 20, 2012, 18:42
#include "mymain.h"
#include "ui_mymain.h"
#include "QFile.h"
#include "QPixmap.h"
#include "QPainter.h"

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

    QFile myFile("readme.txt");
    if(!myFile.open(QIODevice::ReadOnly))
       return;

    QPainter painter(this);
    QPixmap img("C:\Qt\project\Object\debug\readme.txt");
    painter.drawPixmap(0, 0, img);
}

myMain::~myMain()
{
    delete ui;
}

Выдается ошибка линковки, что есть неизвестные символы \Q \p \O \d \r
Что сейчас ему не понравилось?


Название: Re: drawText in QPainter
Отправлено: mutineer от Март 20, 2012, 18:43
блин, тебе же сказали уже, что рисовать надо не в конструкторе, а в paintEvent()

а непонравилось то, что слеши должны быть двойные

и QPixmap не откроет тескстовый файл, он картинку может открыть


Название: Re: drawText in QPainter
Отправлено: AndyKuvaldin от Март 20, 2012, 18:44
так а зачем рисовать QPixmap, если можно запомнить считанную строку и отобразить ее в paintEvent() через painter.drawText()? или ты думаешь, что QPixmap возьмет и сам прочитает текст из файла и сгенерирует для него картинку? :)

paintEvent() Что делает?


Название: Re: drawText in QPainter
Отправлено: AndyKuvaldin от Март 20, 2012, 19:00
#include "mymain.h"
#include "ui_mymain.h"
#include "QFile.h"
#include "QString.h"
#include "QTextStream.h"
#include "QRect.h"
#include "QFont.h"
#include "QPainter.h"

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

    QString str;

    QPainter painter(this);
    QRect r = QRect(0, 0, 200, 200);
    painter.setFont(QFont("Times", 14, QFont::Normal));
    painter.drawRect(r);

    QFile myFile("readme.txt");
    if(!myFile.open(QIODevice::ReadOnly))
       return;
    QTextStream stream(&myFile);
    while (!stream.atEnd())
    {
      str = stream.readLine().toLocal8Bit();
      painter.drawText(r, Qt::AlignCenter | Qt::TextWordWrap, str);
    }
}

myMain::~myMain()
{
    delete ui;
}

void myMain::paintEvent(QPaintEvent*)
{
   
}
Как и где должен вызываться paintEvent?
И что ему должно передаваться в качестве аргумента?


Название: Re: drawText in QPainter
Отправлено: mutineer от Март 20, 2012, 19:02
Как и где должен вызываться paintEvent?
И что ему должно передаваться в качестве аргумента?

нигде явно не должен вызываться - система сама его вызовет когда надо.
и найди уже тег [ code ] в редакторе сообщений форума


Название: Re: drawText in QPainter
Отправлено: AndyKuvaldin от Март 20, 2012, 19:11
Код:
myMain::myMain(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::myMain)
{
    ui->setupUi(this);

    QString str;
    QFile myFile("readme.txt");
    if(!myFile.open(QIODevice::ReadOnly))
       return;
    QTextStream stream(&myFile);
    while (!stream.atEnd())
    {
      str = stream.readLine().toLocal8Bit();
    }
}

myMain::~myMain()
{
    delete ui;
}

void myMain::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    QRect r = QRect(0, 0, 200, 200);
    painter.setFont(QFont("Times", 14, QFont::Normal));
    painter.drawRect(r);
    painter.drawText(r, Qt::AlignCenter | Qt::TextWordWrap, str);
}

Как будет передаваться считанная строка в ивент?


Название: Re: drawText in QPainter
Отправлено: mutineer от Март 20, 2012, 19:11
Сделай ее полем класса myMain


Название: Re: drawText in QPainter
Отправлено: AndyKuvaldin от Март 20, 2012, 19:19
Код:
#ifndef MYMAIN_H
#define MYMAIN_H

#include <QtGui/QMainWindow>

namespace Ui
{
    class myMain;
}

class myMain : public QMainWindow
{
    Q_OBJECT

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

protected:
    void paintEvent(QPaintEvent *event);

private:
    QString str;
    Ui::myMain *ui;
};

#endif // MYMAIN_H

Код:
#include "mymain.h"
#include "ui_mymain.h"
#include "QFile.h"
#include "QString.h"
#include "QTextStream.h"
#include "QRect.h"
#include "QFont.h"
#include "QPainter.h"

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

    QFile myFile("readme.txt");
    if(!myFile.open(QIODevice::ReadOnly))
       return;
    QTextStream stream(&myFile);
    while (!stream.atEnd())
    {
      str = stream.readLine().toLocal8Bit();
    }
}

myMain::~myMain()
{
    delete ui;
}

void myMain::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    QRect r = QRect(0, 0, 200, 200);
    painter.setFont(QFont("Times", 14, QFont::Normal));
    painter.drawRect(r);
    painter.drawText(r, Qt::AlignCenter | Qt::TextWordWrap, str);
}

Ошибка collect2 ld returned 1


Название: Re: drawText in QPainter
Отправлено: mutineer от Март 20, 2012, 19:23
точнее ошибку напиши


Название: Re: drawText in QPainter
Отправлено: AndyKuvaldin от Март 20, 2012, 19:25
Выполняется сборка проекта Object...
Настройки не изменились, этап QMake пропускается.
Запускается: C:/Qt/2009.03/mingw/bin/mingw32-make.exe -w
mingw32-make: Entering directory `C:/Qt/project/Object'
C:/Qt/2009.03/mingw/bin/mingw32-make -f Makefile.Debug
mingw32-make[1]: Entering directory `C:/Qt/project/Object'
g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mthreads -Wl -Wl,-subsystem,windows -o debug\Object.exe debug/main.o debug/mymain.o debug/moc_mymain.o -L"c:\Qt\2009.03\qt\lib" -lmingw32 -lqtmaind -lQtGuid4 -lQtCored4
mingw32-make[1]: Leaving directory `C:/Qt/project/Object'
mingw32-make: Leaving directory `C:/Qt/project/Object'
C:\Qt\2009.03\mingw\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\mingw32\bin\ld.exe: cannot open output file debug\Object.exe: Permission denied
collect2: ld returned 1 exit status
mingw32-make[1]: *** [debug\Object.exe] Error 1
mingw32-make: *** [debug] Error 2
Завершено с кодом возврата 2.
Ошибка во время сборки проекта Object
Во время выполнения сборки на этапе 'Make'


Название: Re: drawText in QPainter
Отправлено: BRE от Март 20, 2012, 19:27
Заверши предыдущую сборку программы. Убей в памяти Object.exe. :)


Название: Re: drawText in QPainter
Отправлено: AndyKuvaldin от Март 20, 2012, 19:39
А почему функция вызывается один раз на 1 строчку последнюю...
А что нужно исправить если я хочу что бы каждая считанная строка оказывалась отрисованная...?


Название: Re: drawText in QPainter
Отправлено: kambala от Март 20, 2012, 20:02
сохрани все строки в QStringList и рисуй их


Название: Re: drawText in QPainter
Отправлено: mutineer от Март 20, 2012, 20:50
А почему функция вызывается один раз на 1 строчку последнюю...
А что нужно исправить если я хочу что бы каждая считанная строка оказывалась отрисованная...?

потому что каждая новая считанная строка перезаписывает старую