将QRadioButton添加到没有布局的QWidget中

时间:2013-06-11 15:22:14

标签: qt qwidget qradiobutton qrect

我正在尝试做一些我认为非常容易的事情:在没有任何布局的情况下将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中我的插槽功能吗?

由于

1 个答案:

答案 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

希望有所帮助。