1

我正在尝试做一些我认为非常容易的事情:在没有任何布局的情况下将 QRadioButton 添加到我的 QWizardPage 中。

当用户单击 Next 按钮时,将调用以下添加 QRadioButton 的代码(信号 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) 和 rect2 的正确值 (50, 60, 260, 40)

那么,问题出在哪里,如何在没有布局的情况下将 QRadioButton 添加到 QWidget 中?

编辑

这很奇怪,如果当用户单击下一步按钮时,我没有将 QRadioButton 添加到 QWizardPage 中,而是将它们添加到 QWizard 构造函数中,它可以工作。

有人能告诉我为什么我不能将 QRadioButton 添加到我的 QWizardPage 到我的插槽函数中吗?

谢谢

4

1 回答 1

3

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,而是使用布局和嵌套布局来定位所有内容。添加伸展和垫片以及您需要的任何其他东西。这很棒。然后,如果您稍后需要显示或隐藏某些内容,请将其嵌套在 a 中QWidget,然后显示和隐藏该小部件以在可见时进行调整。

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

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

可能是在QRadioButton没有布局的情况下添加 a 时,它不会更新您的小部件。

如果您更改小部件中的内容,则需要发布一个update()事件以使其反映。

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

此外,当您不使用布局时,分层和定位可能会有点疯狂。确保您没有在添加按钮的位置顶部绘制其他东西。

这里还有一些要记住的事情。虽然看起来你可能已经在处理其中的一些问题了......

另一个可能发生的问题是,如果您将QRadioButtonnot 添加到布局中并忘记为其添加父级,它可能根本不会被添加。QObject布局也很好地处理了s 的父子关系。

最后,您需要确保您的按钮在父窗口小部件的范围内存在。因此,如果您在插槽中声明它,并且它具有本地范围,那么当您离开插槽时,它就消失了。(你把它放在堆上,所以应该没问题)。

所以让它成为你的子类的成员变量QWizardPage,并使它成为一个指针。Qt 可以很好地处理对象的父级,并且如果它们正确地位于对象树上,则可以正确地删除它们。

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

QRadioButton当您使用s时,请务必查看在布局中使用“QGroupBox” 。这很好地处理了独占属性。

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

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

希望有帮助。

于 2013-06-11T19:09:26.163 回答