Пример "Text Finder"Файлы:
Пример "Text Finder" демонстрирует, как динамически обрабатывать формы, используя модуль QtUiTools. Динамическая обработка форм позволяет обрабатывать формы во время выполнения изменяя только UI-файл проекта. Программа позволяет пользователю искать отдельное слово в содержимом текстового файла. Этот текстовый файл подключается в ресурсе проекта и загружен и показан на экране при запуске. Настройка файла ресурсовРесурсы, требуемые Text Finder:
textfinder.ui содержит все необходимые для Text Finder объекты QWidget. QLineEdit используется для ввода информации пользователем, QTextEdit - для вывода содержимого input.txt, QLabel - для вывода текста "Keyword", а QPushButton - для кнопки "Find". Снимок экрана ниже показывает предварительный вид, полученный в QtDesigner. Файл textfinder.qrc используется для сохранения textfinder.ui и input.txt в исполняемом файле приложения. В файле содержится следующий код: <!DOCTYPE RCC><RCC version="1.0"> <qresource> <file>forms/textfinder.ui</file> <file>forms/input.txt</file> </qresource> </RCC> Для получения дополнительной информации о файлах ресурсов смотрите Систему ресурсов Qt. Для генерации формы во время выполнения пример слинкован вместе с библиотекой модуля QtUiTools. Это сделано в файле textfinder.pro, который содержит следующие строки: CONFIG += uitools HEADERS = textfinder.h RESOURCES = textfinder.qrc SOURCES = textfinder.cpp main.cpp Определение класса TextFinderКласс TextFinder является подклассом QWidget и служит для размещения объектов QWidget, к которым нам необходим доступ в пользовательском интерфейсе. Метка QLabel пользовательского интерфейса здесь не объявляется, поскольку нам не нужно получать к ней доступ. class TextFinder : public QWidget { Q_OBJECT public: TextFinder(QWidget *parent = 0); private slots: void on_findButton_clicked(); private: QWidget* loadUiFile(); void loadTextFile(); QPushButton *ui_findButton; QTextEdit *ui_textEdit; QLineEdit *ui_lineEdit; bool isFirstTime; }; Слот on_findButton_clicked() - слот с именем, согласованным с соглашением имен Автоматического соединения, требуемого для uic. Реализация класса TextFinderКонструктор класса TextFinder вызывает функцию loadUiFile(), а затем использует qFindChild() для получения доступа к объектам QWidget пользовательского интерфейса. TextFinder::TextFinder(QWidget *parent) : QWidget(parent) { QWidget *formWidget = loadUiFile(); ui_findButton = qFindChild<QPushButton*>(this, "findButton"); ui_textEdit = qFindChild<QTextEdit*>(this, "textEdit"); ui_lineEdit = qFindChild<QLineEdit*>(this, "lineEdit"); Затем используем QMetaObject чтобы разрешить соединение сигналов и слотов. QMetaObject::connectSlotsByName(this); Функция loadTextFile() вызывается для загрузки в QTextEdit и отображения на экране содержимого файла input.txt. loadTextFile(); Компоновка TextFinder'а устанавливается с помощью setLayout(). QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(formWidget); setLayout(layout); В заключение, заголовок окна устанавливается в значение Text Finder, а isFirstTime в значение true. isFirstTime используется как флаг для указания повторного выполнения операции поиска. В дальнейшем это объясняется с помощью on_findButton_clicked(). Функция loadUiFile() используется для загрузки файла пользовательского интерфейса, предварительно созданного в QtDesigner. Создаётся класс QUiLoader и его функция load() используется для загрузки формы в formWidget, который выступает в качестве места расположения пользовательского интерфейса. Затем функция возвращает formWidget туда, откуда была вызвана. QWidget* TextFinder::loadUiFile() { QUiLoader loader; QFile file(":/forms/textfinder.ui"); file.open(QFile::ReadOnly); QWidget *formWidget = loader.load(&file, this); file.close(); return formWidget; } Как рассматривалось выше, функция loadTextFile() загружает файл input.txt в QTextEdit для вывода на экран его содержимого. Данные читаются с использованием QTextStream в объект QString, line, с помощью функции QTextStream::readAll(). Содержимое line затем добавляется в ui_textEdit. void TextFinder::loadTextFile() { QFile inputFile(":/forms/input.txt"); inputFile.open(QIODevice::ReadOnly); QTextStream in(&inputFile); QString line = in.readAll(); inputFile.close(); ui_textEdit->append(line); ui_textEdit->setUndoRedoEnabled(false); ui_textEdit->setUndoRedoEnabled(true); } Функция on_findButton_clicked() - это слот, который соединён с сигналом ui_findButton'а, clicked(). searchString извлекается из ui_lineEdit, а document извлекается из textEdit. В случае если searchString пустой, используется QMessageBox, запрашивающий у пользователя ввод слова. В противном случае, мы проходим по словам в ui_textEdit, и подсвечиваем все вхождения searchString . Используются два объекта QTextCursor: Один для перебора слов в line и другой - для отслеживания редактирования блоков. void TextFinder::on_findButton_clicked() { QString searchString = ui_lineEdit->text(); QTextDocument *document = ui_textEdit->document(); bool found = false; if (isFirstTime == false) document->undo(); if (searchString.isEmpty()) { QMessageBox::information(this, tr("Empty Search Field"), "The search field is empty. Please enter a word and click Find."); } else { QTextCursor highlightCursor(document); QTextCursor cursor(document); cursor.beginEditBlock(); QTextCharFormat plainFormat(highlightCursor.charFormat()); QTextCharFormat colorFormat = plainFormat; colorFormat.setForeground(Qt::red); while (!highlightCursor.isNull() && !highlightCursor.atEnd()) { highlightCursor = document->find(searchString, highlightCursor, QTextDocument::FindWholeWords); if (!highlightCursor.isNull()) { found = true; highlightCursor.movePosition(QTextCursor::WordRight, QTextCursor::KeepAnchor); highlightCursor.mergeCharFormat(colorFormat); } } cursor.endEditBlock(); Флаг isFirstTime устанавливается равным false в тот момент, когда щелкают findButton. Это необходимо для отмены предыдущего подсвечивания текста перед подсвечиванием следующей искомой строки пользователя. Кроме того, флаг found используется для указания если searchString была найдена внутри содержимого ui_textEdit. Если она не была найдена, то используется QMessageBox для информирования пользователя. isFirstTime = false; if (found == false) { QMessageBox::information(this, tr("Word Not Found"), "Sorry, the word cannot be found."); } } } Функция main()int main(int argc, char *argv[]) { Q_INIT_RESOURCE(textfinder); QApplication app(argc, argv); TextFinder *textFinder = new TextFinder; textFinder->show(); return app.exec(); } Функция main() инициализирует файл ресурсов textfinder.qrc и присваивает значения также, как и выводит на экран TextFinder. Смотрите также Пример "Calculator Builder" и Пример "World Time Clock Builder". |
Попытка перевода Qt документации. Если есть желание присоединиться, или если есть замечания или пожелания, то заходите на форум: Перевод Qt документации на русский язык... Люди внесшие вклад в перевод: Команда переводчиков |