Russian Qt Forum

Qt => Общие вопросы => Тема начата: Hort от Октябрь 30, 2008, 17:44



Название: Как ассоциировать файлы
Отправлено: Hort от Октябрь 30, 2008, 17:44
Как асоциировать файлы со своим приложением в Qt? Желательно небольшой примерчик


Название: Re: Как ассоциировать файлы
Отправлено: Пантер от Октябрь 30, 2008, 18:03
Это платформозависимо. В Куте таких возможностей нет.


Название: Re: Как ассоциировать файлы
Отправлено: Alex Custov от Октябрь 30, 2008, 18:24
В Linux принято создавать .desktop файлы с описанием программы и поддерживаемыми ею MIME типами, а пользователь потом сам ассоциирует, если захочет.


Название: Re: Как ассоциировать файлы
Отправлено: Hort от Октябрь 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". что посоветуете?


Название: Re: Как ассоциировать файлы
Отправлено: ритт от Октябрь 30, 2008, 23:07
RegOpenKeyEx...
а чем QSettings не угодил? :)


Название: Re: Как ассоциировать файлы
Отправлено: Hort от Октябрь 30, 2008, 23:16
пытаюсь асоциировать файлы с помощью WinAPI через реестр. QSetting работает только с 1ой определенной веткой реестра (HKEY_LOCAL_MACHINE помойму) и его возможности ограничены.
ЗЫ: всетаки какая ж головная боль этот WinAPI (все, извиняюсь за выражение, через одно место сделано)


Название: Re: Как ассоциировать файлы
Отправлено: ритт от Октябрь 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


Название: Re: Как ассоциировать файлы
Отправлено: Hort от Октябрь 30, 2008, 23:47
В ветках реестра есть такой параметр как "значение по умолчанию" в винАПИ к нему доступ осуществляется путем передачи нулевой строки ("") а если пытаться передать в QSetting::value("") то вылетает с ошибкой


Название: Re: Как ассоциировать файлы
Отправлено: Hort от Октябрь 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);


Название: Re: Как ассоциировать файлы
Отправлено: ритт от Октябрь 31, 2008, 00:33
всегда пожалуйста :)


Название: Re: Как ассоциировать файлы
Отправлено: Hort от Октябрь 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 - имя значка для связанного файла, должен находится в папке с программой