Каталог статей

Главная » Статьи » Мои статьи

В категории материалов: 19
Показано материалов: 1-10
Страницы: 1 2 »

Сортировать по: Дате · Названию · Рейтингу · Комментариям · Просмотрам
Класс QFileSystemWatcher предназначет за отслеживанием изменений в файлах и директориях.

Например:

Устанавливаем слежку за каким то файлом, передавая классу полный путь к
файлу. Как только файл будет переименован, изменен или удален с жесткого диска.

Простой пример применения:

В заголовчном файле определяем наследника класса:

    QFileSystemWatcher *fsWatcher;


Далле создаем тут же приватный слот, который будет срабатывать когда испустится сигнал объектом
fsWatcher и на экран выведется сообщение о том, что файл изменен

private slots:
    void changed(const QString & flName);

Далее в файле исходников в конструкторе класса пишем следующее:
   
     //Создаем наследника
    fsWatcher = new QFileSystemWatcher(this);
    //
устанавливаем слежку на файл
    fsWatcher->addPath("/home/alexandr/test.txt");
    //
Связываем сигнал со слотом, как только файл будет изменен
    //произойдет вызов слота
changed(QString)
    connect(fsWatcher, SIGNAL(fileChanged(QString)), this,    SLOT(changed(QString)));


    //Описываем наш слот
   void MainWindow::changed(const QString &flName)
   {
      //
В QLabel будет выведено сообщение
      ui->label->setText("Changed " + flName);
   }
Мои статьи | Просмотров: 2852 | Author: Александр | Добавил: qt-boy | Дата: 24.12.2010 | Комментарии (1)

Допустим у нас приложение "Калькулятор". Имеется 9 кнопок с цифрами дабы не связывать каждое нажатие отдельной кнопочки с одним и тем же слотом обрабатывающим вывод цифры на табло и не плодить код, есть прекрасный класс в Qt  - QSignalMapper

Простой пример:

В заголовочном файле декларируем:

  QSignalMapper *signalMapper;

И тут же создаем приватный слот:

  void clicked(const QString & text);

Который будет выводить сообщение с текстом нажатой кнопочки

Далее в конструкторе класса создаем объект класса QSignalMapper

  signalMapper = new QSignalMapper(this);

Далее добавляем в QGridLayout yнаши 9 кнопочек:

 for (int i = 0; i < 9; ++i)
    {
        //Кнопочка с текстом текущей итерации цикла
        QPushButton *button = new QPushButton(QString::number(i));
        //При нажатии на данную кнопочку вызывам слот класса QSignalMapper
        connect(button, SIGNAL(clicked()), signalMapper, SLOT(map()));
       //Привязывем кнопочку к маперу с текстом текущей итерации
        signalMapper->setMapping(button, QString::number(i));
       //ну и добавляем кнопочку в Layout
        ui->gridLayout->addWidget(button, i / 3, i % 3);
    }
    //Теперь когда маппер испуска сигнал о нажатии определенной кнопочки вызывается наш слот
   //и в него передается значение привязанное в мапер для данной кнопочки
    connect(signalMapper, SIGNAL(mapped(const QString &)),
                this, SLOT(clicked(const QString &)));


//А вот и сам наш слот

void MainWindow::clicked(const QString & text)
{
    QMessageBox::information(this, "TEST", text, QMessageBox::Ok);
}

Мои статьи | Просмотров: 10861 | Author: Александр | Добавил: qt-boy | Дата: 23.12.2010 | Комментарии (1)

Данное приложение иллюстрирует использования различных подклассов QEvent. В примере использованы реализации следующих классов:

 <QCloseEvent>
 <QContextMenuEvent>
 <QEvent>
 <QFocusEvent>
 <QHideEvent>
 <QKeyEvent>
 <QMouseEvent>
 <QPaintEvent>
 <QResizeEvent>
 <QShowEvent>
 <QWheelEvent>
Мои статьи | Просмотров: 27563 | Добавил: qt-boy | Дата: 22.08.2010 | Комментарии (6)

В C++ существует множество спецальных алгоритмов для работы с массивами. Они позволяют сортировать данные в массиве, искать в нем какое-либо значение, менять элементы местами и т.д. Для их работы вам необходимо подкючить <algorithm> в начале программы.

Алгоритмы поиска.

Все алгоритмы поиска возвращают итератор на элемент, а не сам элемент.

  • find(begin,end,what) - ищет первый элемент со значенимем what в промежутке begin - end, где begin и end - итераторы соответствующего контейнера
  • adjacent_find(start,end) - ищет два последовательных совпадающих элемента между start и end и возвращает итератор на него
  • search(start,end,sbegin,send) - ищет между start и end последовательность sbegin-send
Мои статьи | Просмотров: 12108 | Добавил: qt-boy | Дата: 22.08.2010 | Комментарии (0)

Иногда при разработке приложений возникает потребность в существовании некоего объекта, который должен быть доступен из многих, совершенно разных частей программы. Примером такого объекта может служить общий контейнер внутренней конфигурации программы. Кроме того, ключевой особенностью такого объекта является единственность его существования – к примеру, объект, работающий с определенным COM портом должен существовать в единственном экземпляре.

Таким образом, мы можем выделить две особенности объекта типа Singleton:

  • Доступность объекта из различных частей программы
  • Единственность существования

Специально выделяю вторую особенность, дабы подчеркнуть суть такого объекта. Первая особенность – просто «полезность», вытекающая из единственности. На практике, эти две особенности идут рядом, поэтому я не буду разделять их детали реализации.

Да, вопрос об обоснованности существования таких объектов и т.п. – это совсем другая тема и философия проектирования. Но мы сейчас не об этом.

Существует несколько подходов к реализации таких объектов. Я предлагаю один из них, которым пользуюсь уже на протяжении многих лет.


Мои статьи | Просмотров: 3072 | Добавил: qt-boy | Дата: 12.08.2010 | Комментарии (1)

Мои статьи | Просмотров: 1160 | Добавил: qt-boy | Дата: 09.08.2010 | Комментарии (0)

По умолчанию аргументы функции tr() воспринимаются в кодировке Latin-1. Для переопределения этого необходимо воспользоваться классом QTextCodec, а именно статической функцией QTextCodec::setCodecForTr().
Так как вызов функции QTextCodec::setCodecForTr() должен быть сделан до первого вызова tr(), то удобнее всего это реализовать сразу после создания объекта QApplication:
Мои статьи | Просмотров: 2282 | Добавил: qt-boy | Дата: 09.08.2010 | Комментарии (1)

Длительные операции в программе можно разделить на две категории. Первая — интенсивные вычислительные задачи, такие как: алгоритмы обработки аудио и видео данных, моделирование. Вторая — взаимодействие с медленными объектами «внешнего мира» программы(управление различным промышленным оборудованием, загрузка файлов по сети и проч.). Для второй категории задач проблема сохранения отзывчивости решается в Qt использованием асинхронных классов, т.е. классов, методы которых сразу после вызова возвращают управление, а о результате своей деятельности они оповещают соответствующим сигналом. Примером таких классов могут служить классы QFtp и QHttp.
В случае интенсивных вычислений (в не зависимости от использования механизма сигнал-слот) обработка событий прерывается, сетевое взаимодействие останавливается, таймеры замирают, программа не перерисовывается и перестает отвечать на ввод пользователя. Иными словами до окончания вычислений программа выглядит зависшей. Сохранить отзывчивость программы можно либо периодической обработкой ожидающих в очереди событий и тогда необходимые вычисления можно оставить в главном потоке, либо созданием дополнительного потока и переносом вычислительных алгоритмов в него. Создание многопоточных приложений требует высокой квалификации от программиста и несколько усложняет код. Для тех, кого не пугает усложнение исходного кода считаю необходимым напомнить первый закон творческого программирования: «Caveat emptor: стоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста». Выбор пути решения зависит от задачи. Практически любую вычислительную задачу можно разбить на несколько подзадач, на несколько частей. Если эти части могут быть решены только последовательно, то велика вероятность того, что оптимальным вариантом будут вычисления в главном потоке. Ежели отдельные части независимы и могут вычисляться параллельно, то использование нескольких потоков может дать значительный прирост производительности.
Самое простое решение заключается в периодическом вызове QCoreApplication::processEvents() в коде вычислений. Эта функция обрабатывает ожидающие в очереди события. В случае, если действия пользователя нежелательны во время выполнения задачи можно отключить обработку событий мыши и клавиатуры заменив вызов QCoreApplication::processEvents() на QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents). С помощью QCoreApplication::processEvents() также можно «синхронизировать» асинхронные методы. Допустим у нас есть класс для общения с неким устройством. Ему можно послать команду с помощью метода send(QByteArray array) и получить ответ в слот data(QByteArray array) в течение некоторого времени. На случай отсутствия ответа предусмотрим таймаут. Если ответ не придет в течение 5 секунд, то ожидание мы прекращаем.
Мои статьи | Просмотров: 4951 | Добавил: qt-boy | Дата: 09.08.2010 | Комментарии (0)

Чтобы добавить информацию о версии в библиотеку достаточно включить следующую строку в файл проекта:

VERSION=1.2.3

В случае исполнимого файла все будет несколько сложнее. Для начала создайте файл ресурсов myapp.rc и включите информацию о нем в файл проекта:
RC_FILE = myapp.rc

Теперь отредактируем файл ресурсов:
#ifndef Q_CC_BOR
# if defined(UNDER_CE) && UNDER_CE >= 400
# include <winbase.h>
# else
# include <winver.h>
# endif
#endif
VS_VERSION_INFO VERSIONINFO
FILEVERSION 0,2,0,0
PRODUCTVERSION 0,2,0,0
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x4L
FILETYPE 0x1L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904b0"
BEGIN
VALUE "Comments", "Application\0"
VALUE "CompanyName", "SPECTRON NPO\0"
VALUE "FileDescription", "XReport project\0"
VALUE "FileVersion", "0, 2, 0, 0\0"
VALUE "InternalName", "XReport\0"
VALUE "LegalCopyright", "Copyright (C) 2008\0"
VALUE "OriginalFilename", "XReport.exe\0"
VALUE "ProductName", "XReport.exe\0"
VALUE "ProductVersion", "0, 2, 0, 0\0"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1200
END
END


Пересоберем проект.
Мои статьи | Просмотров: 2049 | Добавил: qt-boy | Дата: 09.08.2010 | Комментарии (0)

Поместите файл иконки(пусть он будет зваться myappico.ico) в каталог с исходными текстами программы. В том же каталоге создайте файл myapp.rc и поместите в него следущую строчку:


IDI_ICON1 ICON DISCARDABLE "myappico.ico"

Добавьте информацию о файле ресурсов в ваш .pro файл:
RC_FILE = myapp.rc

И наконец, используя qmake, обновите ваши makefile файлы.
Мои статьи | Просмотров: 2662 | Добавил: qt-boy | Дата: 09.08.2010 | Комментарии (0)

1-10 11-19
Форма входа
3D Облако
Мини-чат
Категории раздела
Мои статьи [19]
Облако
About Qt QList Qtractor 0.4.2 QListView git-репозиторий Qt Жасмин Бланшет QtCreator 1.1 Qt Extended Qt Solutions Динамическое приведение QObject библиотеки Qt 4.5.1 Пишем собственный веб броузер QFileDialog QMessageBox Добавление информации о версии в .e Вышли бета-версии библиотеки Qt 4.7 Qt qt quick qt sdk qtcreator Singleton для Qt QInputDialog QColorDialog Примеры использования класса QEvent QFontDialog QFileSystemWatcher следим за директ GIf Анимация в QLabel Открытие ссылки в браузере установл Открытие ссылки в браузере установл Добавление итемов в QTableWidget QMap итератор Помещаем окно посередине экрана Выставляем флаги для окон Отловить нажатие клавиши на QLabel Отловить нажатие клавиши на QLabel Определить какой именно контрол был Показать на время курсор с песочным Сделать окно модальным Зашифровать данные в MD5 или MD4 Удаление из QlistWidget строки Написание DLL на С++ Диалог открытия файла Работа с реестром Ограничение на ввод определенного к QMessageBox подтверждение удаления Многопоточный сервер на примере Чат Отправляем файл на PHP скрипт Пример пересылки от клиента к серве Алгоритм сортировки (не очень оптим но если не важна скорость то сойдет Вставка текста из буфера обмена(при Проверить существует ли файл Распечатка текста из QTextEdit Вывести текст из QTextEdit в диалог Интересное о QFileInfo Отловить событие закрытие окна Проверка веб ссылки на валидность Иконка для QPushButton Преобразовать QString в char* Выдрать IP и порт из строки Получение списка всех файлов в дире Окно поверх всех Ввод пароля в QLineEdit Ввод в QLineEdit только цифр и точк Скачать файл по Ftp Пример использования оператора fore Пример использования класса QDir Получить список папок Кодирование/Декодирвоание Base64 Получить переменные среды Оставить у диалога только кнопку за Запуск сторонней программы из Qt ис Drop Добавление эффекта выделяющего прям Получение информации о свободном пр Запись структуры(пользовательского Получение информации о свободном ди Простой пример использования QProce Как унаследоваться от QObject Отрисовать виджет по форме картинки Перемещение виджета вслед за мышкой Сделать диалог поверх всех окон/поз Повернуть изображение QSignalMapper - как пользоваться Qt приведение типа QFileSystemWatcher следим за директ Добавление сигнала clicked() в QLab Рекурсивный поиск файлов и папок QWheelEvent определить направление Отловить завершение работы системы Валидация на ввод только цифр styleSheet QLabel красим текст под styleSheet QLabel простой пример styleSheet QTableWidget красим заго styleSheet QTableWidget красим QTab QTableWidgetItem текст по центу Проверка сокета Выход из вложенных циклов styleSheet QPushButton выравнивание
Наш опрос
Оцените мой сайт
Всего ответов: 91
Поиск
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Статистика

    Онлайн всего: 2
    Гостей: 2
    Пользователей: 0