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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как ассоциировать файлы  (Прочитано 13035 раз)
Hort
Гость
« : Октябрь 30, 2008, 17:44 »

Как асоциировать файлы со своим приложением в Qt? Желательно небольшой примерчик
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #1 : Октябрь 30, 2008, 18:03 »

Это платформозависимо. В Куте таких возможностей нет.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #2 : Октябрь 30, 2008, 18:24 »

В Linux принято создавать .desktop файлы с описанием программы и поддерживаемыми ею MIME типами, а пользователь потом сам ассоциирует, если захочет.
Записан
Hort
Гость
« Ответ #3 : Октябрь 30, 2008, 22:53 »

пытаюсь прочесть из реестра, но не получается
Код:
	bool checked=false;
HKEY pKey;
unsigned char str[1024];
DWORD strSize=sizeof(str);
if(RegOpenKeyEx(HKEY_CLASSES_ROOT, TEXT("TestCrafter.tdb\\shell\\open\\command"), 0, KEY_ALL_ACCESS, &pKey)
==ERROR_SUCCESS){
if(RegQueryValueEx(pKey,  TEXT(""), NULL, NULL, str, &strSize)==ERROR_SUCCESS){
QMessageBox::information(this, "", QString((const char*)str));
if(QString((const char*)str).contains("tester.exe")) checked=true;
}
}
associate->setChecked(checked);
RegCloseKey(pKey);
выводит 1 символ "t". что посоветуете?
Записан
ритт
Гость
« Ответ #4 : Октябрь 30, 2008, 23:07 »

RegOpenKeyEx...
а чем QSettings не угодил? Улыбающийся
Записан
Hort
Гость
« Ответ #5 : Октябрь 30, 2008, 23:16 »

пытаюсь асоциировать файлы с помощью WinAPI через реестр. QSetting работает только с 1ой определенной веткой реестра (HKEY_LOCAL_MACHINE помойму) и его возможности ограничены.
ЗЫ: всетаки какая ж головная боль этот WinAPI (все, извиняюсь за выражение, через одно место сделано)
« Последнее редактирование: Октябрь 30, 2008, 23:18 от Hort » Записан
ритт
Гость
« Ответ #6 : Октябрь 30, 2008, 23:24 »

из рабочего проекта:
Код:
#ifdef Q_WS_WIN
QSettings reg("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run", QSettings::NativeFormat);
if(value)
reg.setValue(QCoreApplication::applicationName(), '"' + QDir::toNativeSeparators(QCoreApplication::applicationFilePath()) + '"');
else
reg.remove(QCoreApplication::applicationName());
#endif
Записан
Hort
Гость
« Ответ #7 : Октябрь 30, 2008, 23:47 »

В ветках реестра есть такой параметр как "значение по умолчанию" в винАПИ к нему доступ осуществляется путем передачи нулевой строки ("") а если пытаться передать в QSetting::value("") то вылетает с ошибкой
Записан
Hort
Гость
« Ответ #8 : Октябрь 31, 2008, 00:22 »

Большое спасибо Константин! после долгих мучений и листания ассистента, буквально эксперементальным путем всетаки заработало как надо. этот весь WinAPI код заменил на
Код:
	bool checked=false;
QSettings reg("HKEY_CLASSES_ROOT", QSettings::NativeFormat);
if(reg.value("/TestCrafter.tdb/shell/open/command/.").toString().contains("tester.exe"))
checked=true;
associate->setChecked(checked);
Записан
ритт
Гость
« Ответ #9 : Октябрь 31, 2008, 00:33 »

всегда пожалуйста Улыбающийся
Записан
Hort
Гость
« Ответ #10 : Октябрь 31, 2008, 14:01 »

Собственно решил написать пример реализации ассоциации через Qt. Может кому поможет.
Реализация представленна в виде флажка (QCheckBox) который и ассоциирует файлы с программой.

1. Проверяем ассоциацию, если уже связано с нашей программой - отмечаем флажок (если система отличная от Windows - опция недоступна)
Код:
	associate=new QCheckBox;
#ifdef Q_WS_WIN
{
bool checked=false;
QSettings reg("HKEY_CLASSES_ROOT", QSettings::NativeFormat);
if(reg.value("/MyProg.mpf/shell/open/command/.").toString().contains("myprog.exe"))
checked=true;
associate->setChecked(checked);
connect(associate, SIGNAL(stateChanged(int)),SLOT(slotAssociate(int)));
}
#else
associate->setDisabled(true);
#endif

2. Реализуем слот для ассоциации
Код:
void MyProg::slotAssociate(int state)
{
#ifdef Q_WS_WIN
QSettings reg("HKEY_CLASSES_ROOT", QSettings::NativeFormat);
if(state==Qt::Checked){
reg.setValue("/.mpf/.", "MyProg.mpf");
reg.setValue("/MyProg.mpf/DefaultIcon/.", QDir::toNativeSeparators(QCoreApplication::applicationDirPath())+"\\mpf.ico");
reg.setValue("/MyProg.mpf/shell/open/command/.", '"'+QDir::toNativeSeparators(QCoreApplication::applicationFilePath())+"\" \"%1\"");
}else if(state==Qt::Unchecked){
reg.setValue("/MyProg.mpf/shell/open/command/.", "");
}
#endif
}

Примечания:
.mpf - расширение файла с которым будем связывать программу
MyProg - собственно имя самой программы
mpf.ico - имя значка для связанного файла, должен находится в папке с программой
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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