Свойство доступа Qt C ++ - PullRequest
       5

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

0 голосов
/ 09 ноября 2011

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

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
}

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

Ответы [ 5 ]

1 голос
/ 09 ноября 2011

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

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

Button::Button(Widget* parent) : QPushButton(parent)
{
   parent->value = 0;
}
0 голосов
/ 09 ноября 2011

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

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

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

0 голосов
/ 09 ноября 2011

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

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

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

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

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

    void updateValue(int value);
private:
    int value;
}
0 голосов
/ 09 ноября 2011

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

0 голосов
/ 09 ноября 2011

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

Изменить

Button::Button(QWidget * parent )
{
}

TO

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

Или

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

Button::Button(QWidget * parent )
{ 
    Widget* wparent = static_cast<Widget*>(parent);
    //now your can access wparent member variables
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...