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 еще не создан, поэтому значение не инициализировано.