Здравствуйте, господа форумчане. Задался тут вопросом как программно скрывать и показывать свойство собственного виджета в таблице свойств 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.
Буду рад любым советам.