2013-06-11 10 views
0

Я пытаюсь сделать что-то, что, по моему мнению, было бы очень легко: добавление QRadioButton в мою QWizardPage без макета.Добавить QRadioButton в QWidget без макета

Следующий код, который добавляет QRadioButton вызывается, когда пользователь нажимает кнопку Next (сигнал currentIdChanged вызывает код):

int newPositionY = 0; 
for (vector<Events::VCS::PnPDevice>::const_iterator it=m_devices.begin(); it!=m_devices.end(); it++) 
{ 
    if (it->type == Events::VCS::HEADSET) 
    { 
     //add a radio button 
     stringstream text; 
     text << (it->name) << " " << (it->serialNumber); 
     QRadioButton* radioButton = new QRadioButton(ui.wpSINGLE_USER); 
     radioButton->setGeometry(50, 20 + newPositionY, 260, 40); 
     radioButton->setText(text.str().c_str()); 
     newPositionY = newPositionY + 40 
    } 
} 

}

Я добавил этот маленький кусочек кода, чтобы увидеть, что происходит с моим QRadioButton

QList<QRadioButton*> listButton = ui.wpSINGLE_USER->findChildren<QRadioButton*>(); 
int size = listButton.size(); 
QRect rect1 = listButton[0]->rect(); 
QRect rect2 = listButton[1]->rect(); 

Я тогда понял, что кажется, что проблема может быть QRect.

Значение для rect1 и rect2 ошибочно. rect1 = (0, 0, 259, 39) и rect2 = (0, 0, 259, 39) Правильное значение для rect1 должно быть (50, 20, 260, 40) и n для rect2 (50, 60, 260, 40)

Итак, в чем проблема, как добавить QRadioButton в QWidget без макета?

EDIT

Это странно, если, вместо добавления QRadioButton в QWizardPage, когда пользователь нажимает кнопку, расположенную рядом я добавляю их в застройщик QWizard, это работает.

Может кто-нибудь сказать мне, почему я не могу добавить QRadioButton в свою QWizardPage в мою функцию слота?

Благодаря

ответ

2

QRect правильно себя. Вы должны проверить geometry(), а не rect().

http://doc-snapshot.qt-project.org/4.8/qwidget.html#geometry-prop

http://doc-snapshot.qt-project.org/4.8/qwidget.html#rect-prop

http://doc-snapshot.qt-project.org/4.8/application-windows.html#window-geometry

Вот некоторые QWizard примеры, которые стоит изучить ...

http://qt-project.org/doc/qt-4.8/dialogs-trivialwizard.html

http://qt-project.org/doc/qt-4.8/dialogs-classwizard.html

http://qt-project.org/doc/qt-4.8/dialogs-licensewizard.html

Вообще говоря ...

Использование раскладок, делает вашу жизнь легче. Существует кривая обучения, и сначала код выглядит смешно, но вы будете благодарны за то, что вы это сделали в конечном итоге. Если это вообще возможно, я избегаю использования Qt Designer, и я использую макеты и вложенные макеты для размещения всего. Добавьте в растяжки и прокладки и все, что вам нужно. Здорово. И тогда, если вам нужно что-то показать или скрыть позже, вы вложите это в QWidget, и вы покажете и спрячете этот виджет, чтобы настроить его, когда он виден.

http://qt-project.org/doc/qt-4.8/layout.html

http://qt-project.org/doc/qt-4.8/tutorials-widgets-windowlayout.html

Это может быть, что, когда QRadioButton добавляется без макета, он не обновляет свой виджет.

Если вы изменяете то, что находится в вашем виджете, вам нужно разместить update() событие, чтобы оно отражалось.

http://doc-snapshot.qt-project.org/4.8/qwidget.html#update

Кроме того, когда вы не используете макеты, наслоение и позиционирование может пойти немного сумасшедшие. Убедитесь, что вы не рисуете что-то еще над местом, где добавлена ​​кнопка.

Вот еще несколько вещей, о которых следует помнить. Хотя похоже, что вы можете позаботиться об этом уже ...

Другая проблема, которая может произойти, заключается в том, что вы добавили QRadioButton не в макет и забыли родительский элемент, вероятно, он не будет добавлен в все. Воспитание QObject s прекрасно обрабатывается макетами.

И, наконец, вам нужно убедиться, что ваша кнопка существует для области вашего родительского виджета. Поэтому, если вы объявите его в слоте и у вас есть локальная область, к моменту выхода из этого слота он исчезнет. (Вы кладете его в кучу, так что все должно быть в порядке).

Так что сделайте его переменной-членом для вашего подкласса QWizardPage и сделайте его указателем. Qt отлично справляется с воссозданием объектов, а удаление корректно, если они находятся на дереве объектов правильно.

http://qt-project.org/doc/qt-4.8/objecttrees.html

быть также обязательно смотреть на использовании «QGroupBox» в макете при использовании QRadioButton с. Это отлично справляется с эксклюзивным атрибутом.

http://doc-snapshot.qt-project.org/4.8/widgets-groupbox.html

http://doc-snapshot.qt-project.org/4.8/qradiobutton.html#details

Надежда, что помогает.

+0

Обновление не работает, но добавление QRadioButton в макет работ. Также +1 для вас действительно хороший и хорошо документированный ответ. Благодарю. – peterphonic