Russian Qt Forum
Октябрь 01, 2024, 12:19 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Автообновление QFileSystemModel при появлении флешки  (Прочитано 3704 раз)
Barmaglodd
Гость
« : Апрель 02, 2012, 06:54 »

Делаю
Код:
diskModel->setFilter(QDir::Drives);
diskModel->setRootPath("");
Диски отлично отображаются, но при вставке флешки модель не обновляется, и новый диск не появляется?
Как с этим бороться?
Обрабатывать DBT_DEVICEARRIVAL как-то на костыль смахивает Грустный
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Апрель 02, 2012, 10:07 »

Вот когда-то писал нотифиер.
devicenotifier.h
Код
C++ (Qt)
#ifndef DEVICENOTIFIER_H
#define DEVICENOTIFIER_H
 
#include <QtCore/QObject>
 
class DeviceNotifier : public QObject
{
Q_OBJECT
 
public:
static DeviceNotifier *instance();
virtual ~DeviceNotifier();
 
protected:
explicit DeviceNotifier (QObject *parent = 0);
 
private:
static DeviceNotifier *pInstance;
 
Q_SIGNALS:
void deviceListChanged ();
};
 
#endif //DEVICENOTIFIER_H
 

devicenotifier_win.cpp
Код
C++ (Qt)
#include <QtCore/QCoreApplication>
#include <QtCore/QDebug>
 
#include "qt_windows.h"
#include "dbt.h"
 
 
#include "devicenotifier.h"
 
Q_CORE_EXPORT HINSTANCE qWinAppInst ();
 
DeviceNotifier *DeviceNotifier::pInstance = 0;
 
HWND wnd = 0;
 
void createWindow ();
LRESULT CALLBACK windowProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
void destroyWindow ();
 
DeviceNotifier *DeviceNotifier::instance ()
{
if (!DeviceNotifier::pInstance) {
pInstance = new DeviceNotifier (QCoreApplication::instance ());
}
 
return pInstance;
}
 
DeviceNotifier::DeviceNotifier (QObject *parent)
: QObject (parent)
{
createWindow ();
}
 
DeviceNotifier::~DeviceNotifier ()
{
if (pInstance == this) {
pInstance = 0;
destroyWindow ();
}
}
 
void createWindow ()
{
WNDCLASS wc;
wc.style = 0;
wc.lpfnWndProc = windowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = 0;
wc.hIcon = 0;
wc.hCursor = 0;
wc.hbrBackground = 0;
wc.lpszMenuName = 0;
wc.lpszClassName = L"DeviceNotifierWindow";
 
RegisterClass (&wc);
 
wnd = CreateWindow (wc.lpszClassName,
wc.lpszClassName,
0,
0,
0,
0,
0,
0,
0,
0,
0);
if (!wnd) {
qDebug () << QString ("Error creating DeviceNotifier window %1")
  .arg (static_cast <int> (GetLastError()));
}
}
 
LRESULT CALLBACK windowProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message) {
case WM_DEVICECHANGE:
switch (wParam) {
case DBT_DEVICEARRIVAL:
case DBT_DEVICEREMOVECOMPLETE:
QMetaObject::invokeMethod (DeviceNotifier::instance (),
  "deviceListChanged",
  Qt::AutoConnection);
break;
}
break;
}
 
return DefWindowProc (hwnd, message, wParam, lParam);
}
 
void destroyWindow ()
{
if (wnd) {
DestroyWindow (wnd);
}
 
UnregisterClass (L"DeviceNotifierWindow", 0);
}
 

devicenotifier_unix.cpp
Код
C++ (Qt)
#include <QtCore/QCoreApplication>
#include <QtCore/QFileSystemWatcher>
#include <QtCore/QStringList>
 
#include "devicenotifier.h"
 
QFileSystemWatcher *watcher = 0;
 
DeviceNotifier *DeviceNotifier::pInstance = 0;
 
DeviceNotifier *DeviceNotifier::instance ()
{
if (!pInstance) {
pInstance = new DeviceNotifier (QCoreApplication::instance ());
}
 
return pInstance;
}
 
DeviceNotifier::DeviceNotifier (QObject *parent)
: QObject (parent)
{
if (!watcher) {
watcher = new QFileSystemWatcher ();
watcher->addPath ("/dev");
connect (watcher, SIGNAL (directoryChanged (QString)),
this, SIGNAL (deviceListChanged ()));
}
}
 
DeviceNotifier::~DeviceNotifier ()
{
if (pInstance == this) {
if (watcher) {
watcher->deleteLater();
}
pInstance = 0;
}
}
 
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Barmaglodd
Гость
« Ответ #2 : Апрель 02, 2012, 10:32 »

Спасибо, у меня подобный уже есть. Улыбающийся Думал, это штатными средствами Qt решается, а оказывается нет Грустный
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.145 секунд. Запросов: 23.