Использование Style в QT или альтернатива скинам

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Использование Style в QT или альтернатива скинам

Сообщение Slavikk » 08.10.2010 21:09:49

День добрый.

Надоело экспериментировать с написанием скинов, решил попробовать использовать Style в QT (мне нужно скинировать только компоненты без формы (так как скинирование формы зло и травма психики пользователя)). Вот что у меня получилось:

Изображение

Правда как скинировать бегунок процента завершения пока не додумался (может кто подскажет?).

Код: Выделить всё
unit UQApplication_setStyle;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ComCtrls,
  // Для того, что бы был доступен данный юнит пересобирите Lazarus под QT
  // Сервис -> Параметры сборки Lazarus... -> Интерфейс LCL -> Qt
  // После чего необходимо пересобрать Lazarus
  Qt4,
  // Незабудте прописать путь к юниту данного модуля, например так:
  // Проект -> Параметры проекта -> Параметры компилятора ->
  // Другие модули -> $(LazarusDir)\lcl\interfaces\qt
  QtWidgets;

type
  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    ProgressBar1: TProgressBar;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
  MyBas: WideString;
  Widget: QProgressBarH;
begin
  // Применяем определённый стиль
  MyBas := 'plastique';
  // ко всей форме с виджетами
  QApplication_setStyle(@MyBas);

  // Применяем заданнй стиль к определённому виджету, получаем виджет
  Widget := QProgressBarH((TQtWidget(ProgressBar1.Handle).Widget));
  // Заданнй стиль
  MyBas := 'border:1px solid rgb(79,101,125);' +
    ' border-top:1px solid rgb(79,101,125); text-align:center;' +
    ' background-color: rgba(191, 255, 191, 255); border-radius: 8px;';
  // Применяем стиль к виджету
  QWidget_setStyleSheet(Widget, @MyBas);
end;

end.


Собирал в: Lazarus 0.9.29 / FPC 2.5.1 с использованием QT 4.5.3: http://narod.ru/disk/25824088000/Qt_4.5.3.7z.html.
Аватара пользователя
Slavikk
постоялец
 
Сообщения: 208
Зарегистрирован: 15.01.2007 22:34:52
Откуда: Из лесов...

Re: Использование Style в QT или альтернатива скинам

Сообщение Slavikk » 11.10.2010 01:07:36

День добрый.

Переделал пример, теперь работает применение стилей как для всей формы, так и для определённой группы виджетов или определённого виджета.

1. Примеры таблиц стилей Qt можно посмотреть на сайте: http://doc.crossplatform.ru/qt/4.6.x/stylesheet-examples.html.
2. Примение определённых стилей к определённому типу виджетов не работает если перед этим не применён определённый стиль ко всей форме с виджетами.
3. Так же необходимо исправить в юните qt4 строку с:
Код: Выделить всё
procedure QApplication_setStyleSheet(handle: QApplicationH; sheet: PWideString); cdecl; external Qt4PasLib name 'QApplication_setStyleSheet';

на:
Код: Выделить всё
procedure QApplication_setStyleSheet(handle: QCoreApplicationH; sheet: PWideString); cdecl; external Qt4PasLib name 'QApplication_setStyleSheet'; 


Весь код примера с примечаниями:
Код: Выделить всё
unit UQApplication_setStyle;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ComCtrls,
  // Для того, что бы был доступен данный юнит пересобирите Lazarus под QT.
  // Сервис -> Параметры сборки Lazarus... -> Интерфейс LCL -> Qt .
  // После чего необходимо пересобрать Lazarus .
  Qt4,
  // Не забудте прописать путь к юниту данного модуля, например так:
  // Проект -> Параметры проекта -> Параметры компилятора ->
  // Другие модули -> $(LazarusDir)\lcl\interfaces\qt.
  QtWidgets;

type
  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    ProgressBar1: TProgressBar;
    ProgressBar2: TProgressBar;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
  MyBas: WideString;
  Widget: QProgressBarH;
begin
  // Применяем определённый стиль ко всей форме с виджетами, задаём стиль,
  MyBas := 'plastique';
  // применяем ко всей форме с виджетами .
  QApplication_setStyle(@MyBas);

  // Plastique - один из стандартных стилей в QT,
  // пример использования других стилейможно посмотреть на сайте:
  // http://users.telenet.be/Jan.Van.hijfte/qtforfpc/fpcqt4.html
  // Demos Source -> mainwindow.

  // Применяем определённый стиль к определённому типу виджетов, задаём стиль,
  MyBas :=
    'QProgressBar { border: 2px solid grey;' +
    ' border-radius: 5px; } QProgressBar::chunk {' +
    ' background-color: #05B8CC; width: 20px; }';
  // применяем стиль к определённому типу виджетов.
  QApplication_setStyleSheet(QCoreApplication_instance(), @MyBas);

  // Примеры таблиц стилей Qt можно посмотреть на сайте:
  // http://doc.crossplatform.ru/qt/4.6.x/stylesheet-examples.html.

  // Примение определённых стилей к определённому типу виджетов не работает
  // если перед этим не применён определённый стиль ко всей форме с виджетами.

  // Так же необходимо исправить в юните qt4 строку с:
  // procedure QApplication_setStyleSheet(handle: QApplicationH; sheet: PWideString); cdecl; external Qt4PasLib name 'QApplication_setStyleSheet';
  // на
  // procedure QApplication_setStyleSheet(handle: QCoreApplicationH; sheet: PWideString); cdecl; external Qt4PasLib name 'QApplication_setStyleSheet';

  // Применяем заданнй стиль к определённому виджету, получаем виджет,
  Widget := QProgressBarH((TQtWidget(ProgressBar2.Handle).Widget));
  // задаём стиль,
  MyBas := 'border:1px solid rgb(79,101,125);' +
    ' border-top:1px solid rgb(79,101,125); text-align:center;' +
    ' background-color: rgba(191, 255, 191, 255); border-radius: 8px;';
  // применяем стиль к виджету.
  QWidget_setStyleSheet(Widget, @MyBas);
end;

end.
Аватара пользователя
Slavikk
постоялец
 
Сообщения: 208
Зарегистрирован: 15.01.2007 22:34:52
Откуда: Из лесов...


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 45

Рейтинг@Mail.ru