задрот в различнейших областях
Я создала форму с QTextBrowser и хочу вывести в нее текст из текстового файла.
Как это сделать? Все примеры, что я встречала, не работали с готовыми формами из Designer'a.
Спасибо заранее.

@темы: Вопрос, Qt

Комментарии
18.04.2012 в 23:41

IDDQD - Команда молодости нашей, команда, без которой мне не жить.
Можно попробовать воспользоваться свойством source у QTextBrowser (если из Designer'а), или в исходнике позвать метод setSource и передать путь к файлу, который требуется открыть.
19.04.2012 в 15:21

задрот в различнейших областях
в общем, я сделала ui->textbrowser.setText("...");
но вот проблема, что в текст браузере появляется только текст, вручную напечатанный. Считанный из файла в QString, или просто QString line="текст" не выводится
19.04.2012 в 15:55

IDDQD - Команда молодости нашей, команда, без которой мне не жить.
в общем, я сделала ui->textbrowser.setText("...");
setHtml для этого использовать нужно.
19.04.2012 в 16:03

И тесно облакам.
QFile file(filename);
file.open(filename, QIODevice::readOnly);
ui->textbrowser.setText(file.readAll());

но вот проблема, что в текст браузере появляется только текст, вручную напечатанный. Считанный из файла в QString, или просто QString line="текст" не выводится
Это ненормально, так совершенно не должно быть. Покажите полностью код, который не работает.

И еще: если вы в коде пишете строки с русскими символами, нужно их оборачивать в функцию tr() и вызвать в начале программы QTextCodec::setCodecForTr(QTextCodec::codecForName("ваша кодировка исходников")); Иначе могут быть проблемы с кодировкой на разных системах.
19.04.2012 в 19:01

задрот в различнейших областях
Flex Ferrum, setHtml? Попробуем.
.... ноу. Ничего. Ему еще мое QString::fromLocal8Bit(line) внутри не понравилось, пришлось кодировку убрать (в примере английский текст для начала)
Ri, у меня почти так, отдавать сразу readall правда не пробовала.
QFile inputFile("readme.txt");
inputFile.open(QIODevice::ReadOnly);
QTextStream in(&inputFile);
QString line = in.readAll();
inputFile.close();
ui->textBrowser->setText(QString::fromLocal8Bit(line));
с кодировкой все окай, кодировка у меня вон fromLocal8Bit.
... тоже ничего. пустой qtextbrowser.
19.04.2012 в 19:13

И тесно облакам.
А где этот код находится? В конструкторе? Или где-то еще? Он точно выполняется? А сделайте

qDebug() << QString::fromLocal8Bit(line);

, посмотрите, есть там что-то вообще или нет. А вы уверены, что оно найдет ваш файл без полного пути? Вам open() вообще возращает true?
19.04.2012 в 19:22

задрот в различнейших областях
Ri, код находится в конструкторе, проверить не могу - отладчик не работает.
да даже если не снимать, а прописать QString line="text"; ui->textbrowser->setText(line); не выведет

выдает ошибку - D:\QT\Testirka-build-desktop-Qt_4_8_0_for_Desktop_-_MSVC2008__Qt_SDK_________\..\Testirka\mainwindow.cpp:16: ошибка: C2664: 'QString::fromLocal8Bit' : cannot convert parameter 1 from 'QString' to 'const char *'
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
19.04.2012 в 19:29

И тесно облакам.
В конструкторе этот код находится после "ui->setupUi(this);"?

Хм, если оно у вас выдает такую ошибку, то оно у вас вообще не компилится. Тогда логично: что бы вы там ни писали, у вас запускается просто экзешник, скомпиленный в прошлый успешный раз. Поэтому ничего и не выводит. Поставьте в настройках -> сборка и запуск -> всегда собирать проект перед запуском.

А не компилится оно, потому что вы неправильно используете функцию QString::fromLocal8Bit, ей нужен другой тип аргумента. Она вам не нужна, вам надо перед чтением сделать

in.setCodec(QTextCodec::codecForLocale ());
19.04.2012 в 19:45

задрот в различнейших областях
Ri, убрала local, выводит в вывод приложения? пустую строку, то есть ""
Да, в конструкторе находится после ui->setupUi(this);
Поставьте в настройках -> сборка и запуск -> всегда собирать проект перед запуском. стоит и давно уже.
кстати, я прописывала полный путь, дай бог память, вроде был D:\QT\Testirka\readme.txt. Результат не поменялся, только он ворнинги на Q и T выводил
19.04.2012 в 20:03

И тесно облакам.
езультат не поменялся, только он ворнинги на Q и T выводил
Потому что нужно писать "D:\\QT\\Testirka\\readme.txt" или "D:/QT/Testirka/readme.txt", иначе это понимается как экранирование.

Так, еще раз.
1. Убедитесь, что проект у вас действительно компилится успешно, а запускается новая версия. Ну, через qDebug() хотя бы. Он выводит в вывод приложения, да.
2. Убедитесь, что open() возращает true.
3. Убедитесь, что у вас получилось прочитать данные из файла, что они пишутся в консоль (если в консоли неправильная кодировка, ничего страшного, так бывает).
19.04.2012 в 20:14

задрот в различнейших областях
заработало с "D:\\QT\\Testirka\\readme.txt" этим
странно, смотрела примеры и без этого у кого-то все окей было.
тогда следующий вопрос - я потом скомпилю проект в exe и нужно, чтобы этот файл лежал с ним в одной папке. как тогда прописывать путь?
19.04.2012 в 20:25

И тесно облакам.
Тут такое дело. Если вы не указываете путь к файлу, то файл ищется в рабочей папке. В общем случае рабочая папка может быть какая угодно. Если вы будете только запускать exe из проводника двойным щелчком, то можно просто писать имя файла без пути, программа его найдет, т.к. рабочей папкой будет папка, в которой лежит exe. Если вам нужно более надежное решение, то надо программно определить путь к exe-файлу и искать в его папке этот файл. Средствами Qt это делается довольно просто, если надо, я могу дать примерный код.

И, надеюсь, вы знаете, что для запуска отдельного exe-файла вам нужно будет в его папку положить несколько dll-ок, необходимых ему для работы. Иначе вне Qt Creator он не запустится. И желательно для этих целей компилить в Release-версии, а не в Debug.
19.04.2012 в 20:32

задрот в различнейших областях
Ri, да, за примерный код буду благодарна)
насчет dll-ок надо позыркать, потому что у меня exe сам и не запускается. про release знаю, но пока программка далека от релизной версии))
19.04.2012 в 20:35

И тесно облакам.
QStringList args = QCoreApplication::arguments();
QDir exe_dir = QFileInfo(args.first()).dir();
QString filename = exe_dir.absoluteFilePath("readme.txt");

Идея в том, что первый параметр командной строки всегда должен содержать имя exe-файла.
19.04.2012 в 20:40

задрот в различнейших областях
Ri, ага, и потом передать его в open и т. д.
спасибо, посмотрю и попробую вставить. правда уже не сегодня - нервы с этим qt...