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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как скрыть свойство собственного виджета в Qt Desiner?  (Прочитано 1996 раз)
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« : Июль 08, 2015, 16:26 »

Здравствуйте, господа форумчане. Задался тут вопросом как программно скрывать и показывать свойство собственного виджета в таблице свойств QtDesiner-а?
Используя Q_PROPERTY, удалось создать ряд свойств для своего виджета кнопки. К примеру вот 2 из них:
Код:
class CBUTTON_IND : public QPushButton
{
Q_OBJECT
.....................................
Q_PROPERTY(int ThicknessBorder READ getThicknessBorder WRITE set_thickness_border NOTIFY thicknessBorderChanged)
Q_PROPERTY(int BorderRadius READ getBorderRadius WRITE set_border_radius NOTIFY borderRadiusChanged)
  .....................................

public:
int thickness_border;
int border_radius;
.....................................
void set_thickness_border(int thickness)
{
thickness_border = thickness;
setStyleSheet(QString("background-color: green; border: %1px solid black; border-radius: %2%;").arg(thickness_border).arg(border_radius));
}
 
void set_border_radius(int radius)
{
border_radius = radius;
setStyleSheet(QString("background-color: green; border: %1px solid black; border-radius: %2%;").arg(thickness_border).arg(border_radius));
}

int getThicknessBorder()
{
return thickness_border;
  }

int getBorderRadius()
{
return border_radius;
   }
..................................
signals:
void thicknessBorderChanged();
void borderRadiusChanged();
..................................
};
Хотелось бы реализовать следующее: Если свойство ThicknessBorder установленно в дизайнере в 0, то чтобы свойство BorderRadius было недоступным (или еще лучше скрытым).
А как только свойство ThicknessBorder устанавливается в 1, то чтобы свойство BorderRadius становилось доступным для изменения (ну или снова отображалось).

Поискав информацию, удалось добиться того, что могу скрыть свойство BorderRadius в таблице свойств Qt Desiner-а изначально, установив в коде в Q_PROPERTY флаг DESIGNABLE в false:
   Q_PROPERTY(int BorderRadius READ getBorderRadius WRITE set_border_radius NOTIFY borderRadiusChanged DESIGNABLE false)
но это не решило проблемы, так как при изменении свойства ThicknessBorder, свойство BorderRadius все равно скрытое.

Пробовал так же и следующим образом:
Код:
.............................................................
QDesignerFormWindowInterface *form ;
QExtensionManager *manager;
QDesignerPropertySheetExtension *sheet ;
..............................................................
 
form = QDesignerFormWindowInterface::findFormWindow(this);
if(form){
QDesignerFormEditorInterface *editor = form->core();
manager = editor->extensionManager();
sheet = qt_extension<QDesignerPropertySheetExtension*>(manager, this);
}
.................................................................

int propertyIndex = sheet->indexOf("BorderRadius");

if(thickness_border == 0)
{
sheet->setVisible(propertyIndex, false);
}
else
{
sheet->setVisible(propertyIndex, true);
}
sheet->setChanged(propertyIndex, true);
...............................................................
Но почему-то метод setVisible() не срабатывает, свойство всегда отображается.
Хотя вот следующий код сработал:
Код:
............................................................
int propertyIndex = sheet->indexOf("BorderRadius");

if(thickness_border == 0)
{
sheet->setProperty(propertyIndex, 0);
}
else
{
sheet->setProperty(propertyIndex, 8);
}
sheet->setChanged(propertyIndex, true);
.....................................................
при установке свойства ThicknessBorder в 0, свойство BorderRadius сбрасывается в 0; и наоборот при  ThicknessBorder !=0, BorderRadius = 8.

Буду рад любым советам.
 
Записан
Bepec
Гость
« Ответ #1 : Июль 08, 2015, 16:48 »

Никак без грязных хаков. Данный функционал не реализован в интерфейсе Designer'a.
Записан
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« Ответ #2 : Июль 08, 2015, 17:00 »

Оказывается все работает. Когда я установил DESIGNABLE false в Q_PROPERTY, то через sheet->setVisible(propertyIndex, true); удается отобразить свойство BorderRadius,
и через sheet->setVisible(propertyIndex, false); снова его скрыть.
Вот только изменения свойства BorderRadius вступает в силу лишь после выбора мышью другого виджета. В чем может быть проблема? получается что в дизайнере таблица свойств не перерисовывается, ну или те ячейки в которых отображено мое свойство.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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