7#include <QStandardPaths>
13#if defined(Q_OS_ANDROID)
14#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
15#include <QtCore/private/qandroidextras_p.h>
19#ifdef HAVE_RABBITCOMMON_GUI
21 #include <QMainWindow>
22 #include <QMessageBox>
23 #include <QPushButton>
24 #include <QApplication>
25 #include <QDesktopServices>
29 #include "Information.h"
32 #include <QCoreApplication>
35#include "RabbitCommonTools.h"
36#include "RabbitCommonDir.h"
37#ifdef HAVE_ADMINAUTHORISER
38#include "AdminAuthoriser/adminauthoriser.h"
40#include "RabbitCommonRegister.h"
43#if defined(HAVE_OPENSSL)
44 #include "openssl/opensslv.h"
45 #include "openssl/crypto.h"
46 #include "openssl/ssl.h"
62 #include "CoreDump/MiniDumper.h"
64#include "CoreDump/StackTrace.h"
66#ifdef HAVE_RABBITCOMMON_GUI
67 #include "Log/DockDebugLog.h"
68 #include "Log/DlgFilter.h"
72inline void g_RabbitCommon_InitResource()
74 Q_INIT_RESOURCE(ResourceRabbitCommon);
83 Q_INIT_RESOURCE(QUIWidgetQss);
88inline void g_RabbitCommon_CleanResource()
90 Q_CLEANUP_RESOURCE(ResourceRabbitCommon);
97 Q_CLEANUP_RESOURCE(QUIWidgetQss);
104static Q_LOGGING_CATEGORY(log,
"RabbitCommon.Tools")
105static Q_LOGGING_CATEGORY(logTranslation, "
RabbitCommon.Tools.Translation")
107static CCallTrace* g_pCallStack =
nullptr;
109CTools::CTools() : QObject()
110 , m_Initialized(false)
111#if defined(Q_OS_ANDROID)
112 , m_bShowMaxWindow(
true)
114 , m_bShowMaxWindow(
false)
120 qDebug(log) <<
"CTools::~CTools()";
121#if HAVE_RABBITCOMMON_GUI
123 delete g_pDcokDebugLog;
127CTools* CTools::Instance()
129 static CTools* pTools =
nullptr;
130 if(
nullptr == pTools)
131 pTools =
new CTools();
135int CTools::SetLanguage(
const QString szLanguage)
137 m_szLanguage = szLanguage;
141QString CTools::GetLanguage()
143 if(m_szLanguage.isEmpty())
144 return QLocale::system().name();
151 QString szVersion(RabbitCommon_VERSION);
152 QString szRevision(RabbitCommon_REVISION);
153 if(szRevision.isEmpty()) {
154 szReturn = QObject::tr(
"Version: ") + szVersion;
156 szReturn = QObject::tr(
"Version: ") + szVersion + QObject::tr(
" (From revision: ");
157#if (defined(HAVE_CMARK) || defined(HAVE_CMARK_GFM))
158 szReturn +=
"[" + szRevision +
"](http://github.com/KangLin/RabbitCommon/tree/" + szRevision +
")";
160 szReturn += szRevision;
170 szInfo = QObject::tr(
"- Functions:") +
"\n";
171#if defined(HAVE_RABBITCOMMON_GUI)
172 szInfo += QObject::tr(
" - Have GUI") +
"\n";
174#if defined(HAVE_ABOUT)
175 szInfo += QObject::tr(
" - Have about diaglog") +
"\n";
177 szInfo += QObject::tr(
" - Use cmark-gfm") +
"\n";
179 szInfo += QObject::tr(
" - Use cmark") +
"\n";
182#if defined(HAVE_UPDATE)
183 szInfo += QObject::tr(
" - Have update") +
"\n";
185 szInfo += QObject::tr(
" - The cursom title bar for QWidget") +
"\n";
186 szInfo += QObject::tr(
" - Dock Folder browser") +
"\n";
187 szInfo += QObject::tr(
" - Recent menu") +
"\n";
188 szInfo += QObject::tr(
" - Style") +
"\n";
189 szInfo += QObject::tr(
" - Log") +
"\n";
190 szInfo += QObject::tr(
" - Core dump") +
"\n";
191#if defined(HAVE_OPENSSL)
192 szInfo += QObject::tr(
" - Have encrypt(OPENSSL)") +
"\n";
194#if defined(BUILD_QUIWidget)
195 szInfo += QObject::tr(
" - Have QUIWidget") +
"\n";
197 szInfo += QObject::tr(
" - Applicatoin paths and files: ") +
"\n";
198 szInfo += QObject::tr(
" - Install root path: ") + RabbitCommon::CDir::Instance()->GetDirApplicationInstallRoot() +
"\n";
199 szInfo += QObject::tr(
" - Application path: ") + RabbitCommon::CDir::Instance()->GetDirApplication() +
"\n";
200 szInfo += QObject::tr(
" - Configure path: ") + RabbitCommon::CDir::Instance()->GetDirConfig() +
"\n";
201 szInfo += QObject::tr(
" - Configure file: ") + RabbitCommon::CDir::Instance()->GetFileApplicationConfigure() +
"\n";
202 szInfo += QObject::tr(
" - Translations path: ") + RabbitCommon::CDir::Instance()->
GetDirTranslations() +
"\n";
203 szInfo += QObject::tr(
" - Log path: ") + RabbitCommon::CDir::Instance()->GetDirLog() +
"\n";
204 szInfo += QObject::tr(
" - Data path: ") + RabbitCommon::CDir::Instance()->
GetDirData() +
"\n";
205 szInfo += QObject::tr(
" - Icons path: ") + RabbitCommon::CDir::Instance()->GetDirIcons() +
"\n";
206 szInfo += QObject::tr(
" - Database path: ") + RabbitCommon::CDir::Instance()->GetDirDatabase() +
"\n";
207 szInfo += QObject::tr(
" - Database file: ") + RabbitCommon::CDir::Instance()->GetDirDatabaseFile() +
"\n";
208 szInfo += QObject::tr(
" - Plugins path: ") + RabbitCommon::CDir::Instance()->GetDirPlugins() +
"\n";
209 szInfo += QObject::tr(
" - User folders and files: ") +
"\n";
210 szInfo += QObject::tr(
" - Documents path: ") + RabbitCommon::CDir::Instance()->GetDirUserDocument() +
"\n";
211 szInfo += QObject::tr(
" - Configure path: ") + RabbitCommon::CDir::Instance()->GetDirUserConfig() +
"\n";
212 szInfo += QObject::tr(
" - Configure file: ") + RabbitCommon::CDir::Instance()->GetFileUserConfigure() +
"\n";
213 szInfo += QObject::tr(
" - Data path: ") + RabbitCommon::CDir::Instance()->GetDirUserData() +
"\n";
214 szInfo += QObject::tr(
" - Image path: ") + RabbitCommon::CDir::Instance()->GetDirUserImage() +
"\n";
215 szInfo += QObject::tr(
" - Database path: ") + RabbitCommon::CDir::Instance()->GetDirUserDatabase() +
"\n";
216 szInfo += QObject::tr(
" - Database file: ") + RabbitCommon::CDir::Instance()->GetDirUserDatabaseFile() +
"\n";
218 szInfo += QObject::tr(
"- Dependent libraries:") +
"\n";
219 szInfo += QObject::tr(
" - OpenSSL:") +
"\n";
220#if defined(HAVE_OPENSSL)
221 szInfo +=
" - " + QObject::tr(
"Build Version: ") + OPENSSL_VERSION_TEXT +
"\n";
222 szInfo +=
" - " + QObject::tr(
"Runtime Version: ") + OpenSSL_version(OPENSSL_VERSION) +
"\n";
224 if(QSslSocket::supportsSsl())
226#if (QT_VERSION >= QT_VERSION_CHECK(5, 4, 3))
227 szInfo +=
" - Qt " + QObject::tr(
"Build Version: ") + QSslSocket::sslLibraryBuildVersionString() +
"\n";
229 szInfo +=
" - Qt " + QObject::tr(
"Installed Version: ") + QSslSocket::sslLibraryVersionString() +
"\n";
231#if (QT_VERSION >= QT_VERSION_CHECK(5, 4, 3))
232 szInfo +=
" - Qt " + QObject::tr(
"Build Version: ") + QSslSocket::sslLibraryBuildVersionString() +
"\n";
234 szInfo +=
" - Qt " + QObject::tr(
"Don't install OPENSSL dynamic library. Please install it") +
"\n";
237 szInfo += QObject::tr(
" - StackWalker") +
"\n";
240 szInfo += QObject::tr(
" - cmark-gfm") +
"\n";
242 szInfo += QObject::tr(
" - cmark") +
"\n";
247int CTools::AndroidRequestPermission(
const QString &permission)
249#if defined (Q_OS_ANDROID)
250 #if QT_VERSION > QT_VERSION_CHECK(6, 0, 0)
254 if (QtAndroidPrivate::checkPermission(permission).result()
255 == QtAndroidPrivate::Denied)
257 QtAndroidPrivate::requestPermission(permission).waitForFinished();
259 qInfo(log) <<
"android permission" << permission <<
";status:"
260 << QtAndroidPrivate::checkPermission(permission).result();
267int CTools::AndroidRequestPermission(
const QStringList &permissions)
269 foreach (
auto p, permissions) {
270 AndroidRequestPermission(p);
277 if(1 > argc || !argv) {
278 qCritical(log) <<
"The parameters is error";
284 QFileInfo fi(argv[0]);
285 if(szApplicationName.isEmpty())
286 szName = fi.baseName();
288 szName = szApplicationName;
289 szPath = fi.absolutePath();
290 Init(szName, szPath, szPath + QDir::separator() +
"..");
294 QString szApplicationDirPath,
295 QString szApplicationInstallRoot,
296 const QString szLanguage)
299 qWarning(log) <<
"CTools is already initialized";
304 if(QCoreApplication::applicationName().isEmpty())
306 QCoreApplication::setApplicationName(szApplicationName);
307 CDir::Instance()->SetDirUserDocument();
309 if(QCoreApplication::applicationDirPath().isEmpty()
310 && CDir::Instance()->GetDirApplication().isEmpty())
311 CDir::Instance()->SetDirApplication(szApplicationDirPath);
312 if(CDir::Instance()->GetDirApplicationInstallRoot().isEmpty())
313 CDir::Instance()->SetDirApplicationInstallRoot(szApplicationInstallRoot);
314 if(QCoreApplication::applicationName().isEmpty()
315 || CDir::Instance()->GetDirApplication().isEmpty()
316 || CDir::Instance()->GetDirApplicationInstallRoot().isEmpty())
319 <<
"CTools::Instance()->Init() is called after QApplication a(argc, argv);"
320 "Or call this function with the parameters"
321 "szApplicationName, "
322 "szApplicationDirPath, "
323 "and szApplicationInstallRoot";
328 QStringList permissions;
329 permissions <<
"android.permission.WRITE_EXTERNAL_STORAGE"
330 <<
"android.permission.INTERNET"
331 <<
"android.permission.ACCESS_NETWORK_STATE"
332 <<
"android.permission.CHANGE_WIFI_STATE"
333 <<
"android.permission.ACCESS_WIFI_STATE"
334 <<
"android.permission.ACCESS_NETWORK_STATE"
335 <<
"android.permission.CHANGE_NETWORK_STATE";
336 AndroidRequestPermission(permissions);
338 RabbitCommon::CLog::Instance();
339 SetLanguage(szLanguage);
340 qInfo(logTranslation) <<
"Language:" << szLanguage;
344 QString szQtTranslationPath;
345#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
346 szQtTranslationPath = QLibraryInfo::location(QLibraryInfo::TranslationsPath);
348 szQtTranslationPath = QLibraryInfo::path(QLibraryInfo::TranslationsPath);
350 QStringList qtTranslations;
351 qtTranslations <<
"qt" <<
"qtbase" <<
"qtmultimedia"
353 foreach(
auto f, qtTranslations) {
354 QString szFile = szQtTranslationPath + QDir::separator()
355 + f +
"_" + szLanguage +
".qm";
358 InstallTranslatorFile(szFile);
360 qWarning(logTranslation) <<
"The file isn't exists:" << szFile;
363#ifdef HAVE_RABBITCOMMON_GUI
364 QSettings set(RabbitCommon::CDir::Instance()->GetFileUserConfigure(),
365 QSettings::IniFormat);
366 m_bShowMaxWindow = set.value(
"Tools/Window/ShowMax", m_bShowMaxWindow).toBool();
368 CStyle::Instance()->LoadStyle();
370 CInformation info(
"RabbitCommon, Qt and System information:",
"");
373 qDebug(log) <<
"RabbitCommon:" <<
"\n" <<
Information();
379 foreach(
auto t, m_Translator) {
380 QCoreApplication::removeTranslator(t.data());
382 m_Translator.clear();
384 delete RabbitCommon::CLog::Instance();
387QSharedPointer<QTranslator> CTools::InstallTranslatorFile(
const QString szFile)
389 QSharedPointer<QTranslator> translator
390 = QSharedPointer<QTranslator>(
new QTranslator());
392 qCritical(logTranslation) <<
"new QTranslator fail";
395 bool bRet = translator->load(szFile);
398 bRet = QCoreApplication::installTranslator(translator.data());
401 m_Translator.push_back(translator);
402 qDebug(logTranslation) <<
"Install translator:" << szFile;
406 qCritical(logTranslation) <<
"Install translator fail:" << szFile;
409 qCritical(logTranslation) <<
"Load translator file fail:" << szFile;
410 return QSharedPointer<QTranslator>();
414 const QString szName,
415 TranslationType type,
416 const QString szPluginDir,
417 const QString szLanguage)
419 QString szTranslationName = szName;
423 szSuffix = QDir::separator() + szTranslationName +
"_" + szLanguage +
".qm";
425 case TranslationType::Application:
426 szPath = CDir::Instance()->GetDirTranslations();
427 if(szTranslationName.isEmpty()) {
428 szTranslationName = QCoreApplication::applicationName();
429 szSuffix = QDir::separator() + szTranslationName +
"_" + szLanguage +
".qm";
432 case TranslationType::Library: {
433 szPath = CDir::Instance()->GetDirTranslations();
434 if(szTranslationName.isEmpty()) {
435 qCritical(logTranslation) <<
"Please set translation name";
438#if defined(Q_OS_LINUX)
439 QFile file(szPath + szSuffix);
441 szPath = CDir::Instance()->GetDirTranslations(
"/usr/share");
442 file.setFileName(szPath + szSuffix);
444 szPath = CDir::Instance()->GetDirTranslations(
451 case TranslationType::Plugin:
452 szPath = CDir::Instance()->GetDirPluginsTranslation(szPluginDir);
453 if(szTranslationName.isEmpty()) {
454 qCritical(logTranslation) <<
"Please set translation name";
460 QString szFile = szPath + szSuffix;
464 qCritical(logTranslation) <<
"File isn't exit:" << szFile;
465 return QSharedPointer<QTranslator>();
468 return InstallTranslatorFile(szFile);
471int CTools::RemoveTranslator(QSharedPointer<QTranslator> translator)
473 foreach(
auto t, m_Translator) {
474 if(t == translator) {
475 QCoreApplication::removeTranslator(t.data());
476 m_Translator.removeAll(t);
483void CTools::InitResource()
485 g_RabbitCommon_InitResource();
488void CTools::CleanResource()
490 g_RabbitCommon_CleanResource();
493#if defined(Q_OS_UNIX)
494void SigHandler(
int sig)
501 qCritical(log) <<
"Receive exception signal:" << sig <<
"\n"
502 << g_pCallStack->GetStack(3).toStdString().c_str();
505 qDebug(log) <<
"Receive signal:" << sig;
519 RabbitCommon::EnableMiniDumper();
522 signal(SIGSEGV, SigHandler);
524 signal(SIGBUS, SigHandler);
526 signal(SIGILL, SigHandler);
533#ifdef HAVE_ADMINAUTHORISER
534 return CAdminAuthoriser::Instance()->hasAdminRights();
540bool CTools::ExecuteWithAdministratorPrivilege(
const QString &program,
const QStringList &arguments)
542#ifdef HAVE_ADMINAUTHORISER
543 return CAdminAuthoriser::Instance()->execute(program, arguments);
551 return ExecuteWithAdministratorPrivilege(program, arguments);
554bool CTools::StartWithAdministratorPrivilege(
bool bQuitOld)
558 auto para = QApplication::arguments();
559 QString szApp = QApplication::applicationFilePath();
561#if QT_VERSION > QT_VERSION_CHECK(6, 0, 0) && defined(Q_OS_WIN)
562 szAppImage = qEnvironmentVariable(
"APPIMAGE");
564 szAppImage = QString::fromLocal8Bit(qgetenv(
"APPIMAGE"));
566 qDebug(log) <<
"App:" << szApp << szAppImage;
567 if(!szAppImage.isEmpty())
572 bRet = ExecuteWithAdministratorPrivilege(szApp);
574 bRet = ExecuteWithAdministratorPrivilege(szApp,
578 QApplication::quit();
581 qCritical(log) <<
"Start by root fail:" << QApplication::applicationFilePath()
594 appPath = QCoreApplication::applicationFilePath();
596 if(!szPath.isEmpty())
598 if(appPath.isEmpty())
600 qCCritical(log) <<
"szPath is empty";
604 return RabbitCommon::CRegister::InstallStartRun();
605 return RabbitCommon::CRegister::InstallStartRunCurrentUser();
612 if(QFile::exists(szLink))
613 if(RemoveStartRun(szName, bAllUser))
615 qCCritical(log) <<
"RemoveStartRun" << szName <<
"fail";
623 qCCritical(log) <<
"The desktop file is not exist." << appPath;
626 bool ret = f.link(szLink);
629 QString szCmd =
"ln -s " + appPath +
" " + szLink;
631 qCritical(log) <<
"CTools::InstallStartRun: file link"
632 << f.fileName() <<
" to " << szLink << f.error();
639int CTools::RemoveStartRun(
const QString &szName,
bool bAllUser)
642 QString appName = QCoreApplication::applicationName();
643 if(!szName.isEmpty())
646 return RabbitCommon::CRegister::RemoveStartRun();
647 return RabbitCommon::CRegister::RemoveStartRunCurrentUser();
650 if(!QFile::exists(szLink))
return 0;
653 if(d.remove(szLink))
return 0;
655 QString szCmd =
"rm " + szLink;
657 qCritical(log) <<
"execute" << szCmd <<
"fail";
662bool CTools::IsStartRun(
const QString &szName,
bool bAllUser)
667 return RabbitCommon::CRegister::IsStartRun();
668 return RabbitCommon::CRegister::IsStartRunCurrentUser();
671 if(QFile::exists(szLink))
677 const QString &szName)
684 szContent =
"[Desktop Entry]\n";
685 szContent +=
"Name=" + QCoreApplication::applicationName() +
"\n";
686 szContent +=
"Comment=" + QCoreApplication::applicationName() +
"\n";
687#ifdef HAVE_RABBITCOMMON_GUI
688 szContent +=
"Name[" + QLocale::system().name() +
"]=" + QApplication::applicationDisplayName() +
"\n";
689 szContent +=
"Comment[" + QLocale::system().name() +
"]=" + QApplication::applicationDisplayName() +
"\n";
691 szContent +=
"Name[" + QLocale::system().name() +
"]=" + QCoreApplication::applicationName() +
"\n";
692 szContent +=
"Comment[" + QLocale::system().name() +
"]=" + QCoreApplication::applicationName() +
"\n";
694 szContent +=
"Icon=" + QCoreApplication::applicationName() +
"\n";
695 szContent +=
"Exec=" + QCoreApplication::applicationFilePath() +
"\n";
696 szContent +=
"Categories=Application;Development;\n";
697 szContent +=
"Terminal=false\n";
698 szContent +=
"StartupNotify=true\n";
701 if(!f.open(QFile::WriteOnly))
705 f.write(szContent.toStdString().c_str());
710QString CTools::GetCurrentUser()
714 pwd = getpwuid(getuid());
717 CHAR szUserName[MAX_PATH] = {0};
718 DWORD dwSize=MAX_PATH;
719 ::GetUserNameA(szUserName, &dwSize);
723 return QDir::home().dirName();
727QString CTools::GetHostName()
730 gethostname(buf,
sizeof(buf));
734#ifdef HAVE_RABBITCOMMON_GUI
735QAction* CTools::AddStyleMenu(QMenu *pMenu, QWidget *parent)
737 return pMenu->addAction(QIcon::fromTheme(
"style"),
738 QObject::tr(
"Style"),
746void CTools::InsertStyleMenu(QMenu *pMenu, QAction *before, QWidget *parent)
748 QAction* pAction =
new QAction(QIcon::fromTheme(
"style"),
749 QObject::tr(
"Style"), parent);
752 pAction->setStatusTip(QObject::tr(
"Style"));
753 QObject::connect(pAction, &QAction::triggered, [=](){
758 pMenu->insertAction(before, pAction);
761QMenu* CTools::GetLogMenu(QWidget *parentMainWindow)
763 QMenu* pMenu =
new QMenu(QObject::tr(
"Log"), parentMainWindow);
764 if(!pMenu)
return pMenu;
765 pMenu->setStatusTip(QObject::tr(
"Log"));
766 pMenu->setIcon(QIcon::fromTheme(
"folder-open"));
767 QAction* pAction = pMenu->addAction(QIcon::fromTheme(
"emblem-system"),
768 QObject::tr(
"Settings"),
771 QString szInclude, szExclude;
772 CLog::Instance()->GetFilter(szInclude, szExclude);
773 dlg.SetFilter(szInclude, szExclude);
774 if(QDialog::Accepted == RC_SHOW_WINDOW(&dlg))
776 dlg.GetFilter(szInclude, szExclude);
777 CLog::Instance()->SetFilter(szInclude, szExclude);
780 pAction->setStatusTip(QObject::tr(
"Settings"));
781 pAction = pMenu->addAction(QIcon::fromTheme(
"document-open"),
782 QObject::tr(
"Open Log configure file"),
783 [](){RabbitCommon::OpenLogConfigureFile();});
784 pAction->setStatusTip(QObject::tr(
"Open Log configure file"));
785 pAction = pMenu->addAction(QIcon::fromTheme(
"document-open"),
786 QObject::tr(
"Open Log file"),
787 [](){RabbitCommon::OpenLogFile();});
788 pAction->setStatusTip(QObject::tr(
"Open Log file"));
789 pAction = pMenu->addAction(QIcon::fromTheme(
"folder-open"),
790 QObject::tr(
"Open log folder"),
791 [](){RabbitCommon::OpenLogFolder();});
792 pAction->setStatusTip(QObject::tr(
"Open Log folder"));
793 QMainWindow* pMainWindow = qobject_cast<QMainWindow*>(parentMainWindow);
797 pMainWindow->addDockWidget(Qt::DockWidgetArea::BottomDockWidgetArea,
800 g_pDcokDebugLog->setObjectName(
"dockDebugLog");
801 QAction* pDock = g_pDcokDebugLog->toggleViewAction();
802 pMenu->addAction(pDock);
803 pDock->setText(QObject::tr(
"Log dock"));
804 pDock->setIcon(QIcon::fromTheme(
"floating"));
805 pDock->setStatusTip(QObject::tr(
"Log dock"));
807 qWarning(log) <<
"CTools::GetLogMenu: Don't use dock debug log."
808 <<
"The parent suggest is MainWindow pointer";
814int CTools::RestoreWidget(QWidget *pWidget)
818 if(!pWidget)
return -1;
819 QSettings set(RabbitCommon::CDir::Instance()->GetFileUserConfigure(),
820 QSettings::IniFormat);
822 = set.value(
"MainWindow/Status/Geometry").toByteArray();
823 if(!geometry.isEmpty()) {
824 if(!pWidget->restoreGeometry(geometry))
825 qWarning(log) <<
"Restore geometry fail";
827 QMainWindow* pMainWindow = qobject_cast<QMainWindow*>(pWidget);
829 QByteArray state = set.value(
"MainWindow/Status/State").toByteArray();
830 if(!state.isEmpty()) {
831 if(!pMainWindow->restoreState(state))
832 qWarning(log) <<
"Restore state fail";
838int CTools::SaveWidget(QWidget *pWidget)
842 if(!pWidget)
return -1;
843 QSettings set(RabbitCommon::CDir::Instance()->GetFileUserConfigure(),
844 QSettings::IniFormat);
845 set.setValue(
"MainWindow/Status/Geometry", pWidget->saveGeometry());
846 QMainWindow* pMainWindow = qobject_cast<QMainWindow*>(pWidget);
848 set.setValue(
"MainWindow/Status/State", pMainWindow->saveState());
853int CTools::ShowWidget(QWidget *pWin)
856 qCritical(log) << Q_FUNC_INFO <<
"The parameter is nullptr";
861 QDialog* pDlg = qobject_cast<QDialog*>(pWin);
863 if(m_bShowMaxWindow) {
864 pDlg->showMaximized();
868 if(m_bShowMaxWindow) {
869 pWin->showMaximized();
876void CTools::ShowCoreDialog(QString szTitle, QString szContent, QString szDetail, QString szCoreDumpFile)
878 g_pCallStack->ShowCoreDialog(szTitle, szContent, szDetail, szCoreDumpFile);
Set style and icon theme form.
QString GetDirData(bool bReadOnly=false)
Get data directory.
QString GetDirTranslations(QString szPrefix=QString())
static QString GetDesktopFileLink(const QString &szName=QString(), bool bAllUser=false)
GetDesktopFileLink.
static QString GetDesktopFileName(const QString &szPath=QString(), const QString &szName=QString())
Generate the name of desktop file.