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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как переключиться на стандартный Стиль  (Прочитано 6941 раз)
Hort
Гость
« : Июль 18, 2008, 11:02 »

Хочу сделать, чтобы в приложении можно было переключать стили. При этом надо чтобы один из пунктов был - Системный тиль. Чтобы при его выборе переключался на стиль, который у приложения создается при запуске. Как такое реализовать?
пытался сделать так
Цитировать
   QStyle* defaultStyle=QApplication::style();
   QApplication::setStyle(new QCleanlooksStyle);
   QApplication::setStyle(defaultStyle);
но при установке нового стиля он старый удаляет и приложение выдает ошибку на этапе выполнения. что посоветуете?
Записан
Alex03
Гость
« Ответ #1 : Июль 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();
}
« Последнее редактирование: Июль 18, 2008, 11:22 от Alex03 » Записан
Alex03
Гость
« Ответ #2 : Июль 18, 2008, 11:31 »

Или именно надо узнать какой стиль при запуске был?
Записан
Hort
Гость
« Ответ #3 : Июль 18, 2008, 12:41 »

Или именно надо узнать какой стиль при запуске был?
да именно так. например при запуске из-под Висты, вистовский стиль, из под Linux - стандартный линуксовский стиль, установленный в системе. Надо его кудато както скопировать, а потом чтоб можно было его применять.
Записан
Alex03
Гость
« Ответ #4 : Июль 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!");
    }
Записан
Red Devil
Гость
« Ответ #5 : Июль 19, 2008, 21:37 »

А ты копируй обьект, а не указатель.
Код:
QStyle SystemStyle( *(QApplication::style()) );
И наверное все путем будет.
« Последнее редактирование: Июль 19, 2008, 21:41 от Red Devil » Записан
Hort
Гость
« Ответ #6 : Июль 19, 2008, 23:35 »

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

Код:
   QString defaultStyle = QApplication::style()->objectName();
   QApplication::setStyle(new QCleanlooksStyle);
   QApplication::setStyle(defaultStyle);

правда, здесь оговорочка: имя класса стиля может не совпадать с именем-ключом стиля на фабрике (я с таким сталкивался). поэтому, желательно всё же предварительно ещё с фабрикой пообщаться.
« Последнее редактирование: Июль 20, 2008, 17:23 от Константин » Записан
Hort
Гость
« Ответ #8 : Июль 20, 2008, 08:47 »

Код:
   QString defaultStyle = QApplication::style()->objectName();
   QApplication::setStyle(new QCleanlooksStyle);
   QApplication::setStyle(defaultStyle);
большое спасибо! работает!

можно еще один вопрос по стилям? у меня WinXP и в нем установленна другая тема, отличная от темы по умолчанию. так интерфейс отображается нормально, но окна в QWorkspace не прорисовываются и виден только нижний край окна. если переключить на стандартный стиль в винде или если переключить на встроенный в Qt стиль - все ок. может кто-нибуть знает как от этого можно избавится?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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