Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Hort от Июль 18, 2008, 11:02



Название: Как переключиться на стандартный Стиль
Отправлено: Hort от Июль 18, 2008, 11:02
Хочу сделать, чтобы в приложении можно было переключать стили. При этом надо чтобы один из пунктов был - Системный тиль. Чтобы при его выборе переключался на стиль, который у приложения создается при запуске. Как такое реализовать?
пытался сделать так
Цитировать
   QStyle* defaultStyle=QApplication::style();
   QApplication::setStyle(new QCleanlooksStyle);
   QApplication::setStyle(defaultStyle);
но при установке нового стиля он старый удаляет и приложение выдает ошибку на этапе выполнения. что посоветуете?


Название: Re: Как переключиться на стандартный Стиль
Отправлено: Alex03 от Июль 18, 2008, 11:19
А ${QTDIR}\4.3.3\examples\widgets\styles\ посмотреть?

Код:
void WidgetGallery::changeStyle(const QString &styleName)
{
    if (styleName == "NorwegianWood") {
        QApplication::setStyle(new NorwegianWoodStyle);
    } else {
        QApplication::setStyle(QStyleFactory::create(styleName));
    }
    changePalette();
}


Название: Re: Как переключиться на стандартный Стиль
Отправлено: Alex03 от Июль 18, 2008, 11:31
Или именно надо узнать какой стиль при запуске был?


Название: Re: Как переключиться на стандартный Стиль
Отправлено: Hort от Июль 18, 2008, 12:41
Или именно надо узнать какой стиль при запуске был?
да именно так. например при запуске из-под Висты, вистовский стиль, из под Linux - стандартный линуксовский стиль, установленный в системе. Надо его кудато както скопировать, а потом чтоб можно было его применять.


Название: Re: Как переключиться на стандартный Стиль
Отправлено: Alex03 от Июль 18, 2008, 14:17
Хм... чёта не нашел...
Какойнить бы метод типа QStyle::name() бы...

Там кстати ещё в командной строке -style возможно.

Если поглядеть исходники то там такая эвристика:

Код:
#if defined(Q_WS_X11)
    if(!QApplicationPrivate::styleOverride)
        QApplicationPrivate::x11_initialize_style(); // run-time search for default style
#endif
    if (!QApplicationPrivate::app_style) {
        // Compile-time search for default style
        //
        QString style;
        if (QApplicationPrivate::styleOverride) {
            style = *QApplicationPrivate::styleOverride;
            delete QApplicationPrivate::styleOverride;
            QApplicationPrivate::styleOverride = 0;
        } else {
#if defined(Q_WS_WIN) && defined(Q_OS_TEMP)
            style = QLatin1String("PocketPC");
#elif defined(Q_WS_WIN)
            if ((QSysInfo::WindowsVersion >= QSysInfo::WV_VISTA
                && QSysInfo::WindowsVersion < QSysInfo::WV_NT_based))
                style = QLatin1String("WindowsVista");
                else if ((QSysInfo::WindowsVersion >= QSysInfo::WV_XP
                && QSysInfo::WindowsVersion < QSysInfo::WV_NT_based))
                style = QLatin1String("WindowsXP");
            else
                style = QLatin1String("Windows");                // default styles for Windows
#elif defined(Q_WS_X11) && defined(Q_OS_SOLARIS)
            style = QLatin1String("CDE");                        // default style for X11 on Solaris
#elif defined(Q_WS_X11) && defined(Q_OS_IRIX)
            style = QLatin1String("SGI");                        // default style for X11 on IRIX
#elif defined(Q_WS_X11) || defined(Q_WS_QWS)
            style = QLatin1String("Plastique");                  // default style for X11 and small devices
#elif defined(Q_WS_MAC)
                style = QLatin1String("Macintosh");              // default style for all Mac's
#endif
        }

        QStyle *&app_style = QApplicationPrivate::app_style;
        app_style = QStyleFactory::create(style);
        if (!app_style) {
            QStringList styles = QStyleFactory::keys();
            for (int i = 0; i < styles.size(); ++i) {
                if ((app_style = QStyleFactory::create(styles.at(i))))
                    break;
            }
        }
        if (!app_style)
            qFatal("No styles available!");
    }


Название: Re: Как переключиться на стандартный Стиль
Отправлено: Red Devil от Июль 19, 2008, 21:37
А ты копируй обьект, а не указатель.
Код:
QStyle SystemStyle( *(QApplication::style()) );
И наверное все путем будет.


Название: Re: Как переключиться на стандартный Стиль
Отправлено: Hort от Июль 19, 2008, 23:35
А ты копируй обьект, а не указатель.
Код:
QStyle SystemStyle( *(QApplication::style()) );
И наверное все путем будет.
нет паблик конструктора-копировщика
Цитировать
error: `QStyle::QStyle(const QStyle&)' is private
Alex03
спасибо! это хорошо, но врятли получится такое повторить стандартными средставми


Название: Re: Как переключиться на стандартный Стиль
Отправлено: ритт от Июль 20, 2008, 02:20
Код:
   QString defaultStyle = QApplication::style()->objectName();
   QApplication::setStyle(new QCleanlooksStyle);
   QApplication::setStyle(defaultStyle);

правда, здесь оговорочка: имя класса стиля может не совпадать с именем-ключом стиля на фабрике (я с таким сталкивался). поэтому, желательно всё же предварительно ещё с фабрикой пообщаться.


Название: Re: Как переключиться на стандартный Стиль
Отправлено: Hort от Июль 20, 2008, 08:47
Код:
   QString defaultStyle = QApplication::style()->objectName();
   QApplication::setStyle(new QCleanlooksStyle);
   QApplication::setStyle(defaultStyle);
большое спасибо! работает!

можно еще один вопрос по стилям? у меня WinXP и в нем установленна другая тема, отличная от темы по умолчанию. так интерфейс отображается нормально, но окна в QWorkspace не прорисовываются и виден только нижний край окна. если переключить на стандартный стиль в винде или если переключить на встроенный в Qt стиль - все ок. может кто-нибуть знает как от этого можно избавится?