Пример "Text Finder"
|
Ресурсы, требуемые 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 является подклассом 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_find_Button_clicked() - слот с именем, согласованным с соглашением имен Автоматического соединения, требуемого для uic.
Конструктор класса 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);
The loadTextFile() function is called to load input.txt into QTextEdit to displays its contents. The TextFinder's layout and window title is set and isFirstTime is set to true.
loadTextFile(); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(formWidget); setLayout(layout); setWindowTitle(tr("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 == "") { 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."); } } }
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".
Copyright © 2008 Nokia | Торговые марки | Qt 4.4.3 |
Попытка перевода Qt документации. Если есть желание присоединиться, или если есть замечания или пожелания, то заходите на форум: Перевод Qt документации на русский язык... Люди внесшие вклад в перевод: Команда переводчиков |