我正在尝试做一些我认为非常容易的事情:在没有任何布局的情况下将QRadioButton添加到我的QWizardPage中。
当用户单击按钮Next(信号currentIdChanged调用代码)时,将调用以下添加QRadioButton的代码:
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)和rect2的正确值(50,60,260,40)
那么,问题是,如何在没有布局的情况下将QRadioButton添加到QWidget中?
修改
奇怪的是,如果用户单击下一个按钮而不是将QRadioButton添加到QWizardPage中,我将它们添加到QWizard构造函数中,它可以正常工作。
有人可以告诉我为什么我无法将QRadioButton添加到我的QWizardPage中我的插槽功能吗?
由于
答案 0 :(得分: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
的育儿也可以通过布局很好地处理。
最后,您需要确保您的按钮存在于父窗口小部件的范围内。因此,如果您在插槽中声明它并且它具有本地范围,那么当您离开插槽时,它就会消失。 (你把它放在堆上,所以应该没问题。)
因此,将它作为子类QWizardPage
的成员变量,并使其成为指针。 Qt可以很好地处理对象的父级,如果它们正确地在对象树上,则可以正确删除。
http://qt-project.org/doc/qt-4.8/objecttrees.html
使用QRadioButton
时,还要确保在布局中使用'QGroupBox'。这样可以很好地处理独占属性。
http://doc-snapshot.qt-project.org/4.8/widgets-groupbox.html
http://doc-snapshot.qt-project.org/4.8/qradiobutton.html#details
希望有所帮助。