Свойство доступа Qt C

c #qt

#c #qt

Вопрос:

У меня есть два виджета:

 class Widget: public QWidget
{
   public:
   Button* button;
   Widget();
   int value; // need to get this var
}

Widget::Widget()
{
   button = new Button(this);
}


class Button: public QPushButton
{
   public:
   Button(QWidget* parent = 0);
}

Button::Button(QWidget* parent) : QPushButton(parent)
{
   this->parentWidget()->value // dont see var
}
 

Как я могу увидеть свойство из родительского виджета? Каков наилучший способ сделать это? Спасибо

Комментарии:

1. что именно вы имеете в виду под see? в вашем редакторе (intellisense) — на экране?

2. извините за неточность. Я хотел быть доступным для переменной

Ответ №1:

Ваш конструктор кнопок может использовать виджет вместо QWidget:

 class Button: public QPushButton
{
public:
   Button(Widget* parent = 0);
}

Button::Button(Widget* parent) : QPushButton(parent)
{
   parent->value = 0;
}
 

Комментарии:

1. Это не работает: ‘class QWidget’ не имеет члена с именем ‘value’.

2. @Ramix: Вы заметили, что параметр имеет тип Widget* , а не QWidget* ?

Ответ №2:

У вас есть два варианта

Изменить

 Button::Button(QWidget * parent )
{
}
 

Для

 Button::Button(Widget * parent )
{
   //Here class type is already known
   parent->value;
}
 

Или

используйте static_cast<Widget*>(parent) внутри конструктора, чтобы привести parent к вашему классу, если вы точно знаете, что так будет всегда. В противном случае используйте dynamic_cast<Виджет*>(родительский)

 Button::Button(QWidget * parent )
{ 
    Widget* wparent = static_cast<Widget*>(parent);
    //now your can access wparent member variables
}
 

Ответ №3:

Убедитесь, что вы используете Q_OBJECT макрос. Затем вы можете использовать систему свойств. Оно не предназначено для прямого доступа к элементам QWidget. Они даже не могут быть связаны таким образом — конечно, вы могли бы принудительно использовать свою кнопку, используя (только) свой Widget класс, но это привело бы к тесной связи.

Ответ №4:

Если это нужно только в конструкторе, почему бы просто не передать его в качестве параметра?

 class Button: public QPushButton
{
public:
    Button(int value, QWidget* parent = 0);
}
 

Если это необходимо где-то, кроме конструктора, было бы очень полезно узнать, что делает это значение. Это меняет внешний вид? Меняет ли это поведение? Я спрашиваю, потому что большинство способов предоставления вам прямого доступа к родительскому элементу привязывают ваш виджет к его родительскому элементу, и мне кажется, что есть лучшие способы его разработки.

Например, если value в родительском элементе произошли какие-то важные изменения, вызовите метод в своем классе button, чтобы уведомить их об изменении. Таким образом, любой может использовать ваш класс button, если он вызывает правильные методы.

 class Button: public QPushButton
{
public:
    Button(int value, QWidget* parent = 0);

    void updateValue(int value);
private:
    int value;
}
 

Ответ №5:

Я думаю, что просто преобразование типов поможет:

 Button::Button(QWidget* parent)
{
    cout<<((Widget*)(this->parentWidget())->value; //print parent's value
}
 

Однако логика вашего кода странная: когда вы создаете экземпляр Widget, сначала будет вызван конструктор Button , в котором извлекается значение виджета. Однако класс Widget еще не создан, поэтому значение не инициализировано.