在执行时在布局中添加自定义小部件

adding a custom widget in Layout at execution

我在 Ubuntu 18.04 下并且使用最后一个 QtCreator 和最后一个 Qt5 框架

我正在尝试设置垂直布局,顶部是水平嵌套布局,下面是自定义小部件(目前基于时钟示例)

我设置了一个新的小部件项目,但由于我还不明白如何从 C++ 代码访问嵌套布局,我删除了自动创建的主窗体并在执行时创建了布局。

如果我将我的自定义小部件用作 window 如果我使用 window 并添加我的自定义小部件它可以工作但是如果我添加布局,请将我的自定义小部件添加到此布局和在 window 上调用 setLayout 它消失了...

我几乎尝试了所有命令:首先设置布局或在添加我的小部件之后设置布局。 我试图在我的小部件上调用 show() ,或者在将它添加到布局之前或之后 我尝试首先或最后添加嵌套层没有任何变化 我读过几次关于布局和嵌套的例子和手册 我可以看到我的嵌套布局,但看不到我的小部件

这是我的主要内容:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QWidget w;
    w.setWindowTitle("WOUND : Windings Organiser with Usefull and Neat Drawings");

    QVBoxLayout* hl=new QVBoxLayout;// top vertical layout

    QHBoxLayout* slotqueryLayout=new QHBoxLayout; // nested first horizontal layout
    QLabel *slotqueryLabel = new QLabel("Slot number:");
    QLineEdit *slotqueryEdit = new QLineEdit("48");
    slotqueryLayout->addWidget(slotqueryLabel);
    slotqueryLayout->addWidget(slotqueryEdit);
    hl->addLayout(slotqueryLayout);

    WindingViewer* wv=new WindingViewer(&w); // my widget is just a simple canvas to draw things
    hl->addWidget(wv);
    wv->show(); // dont know if it's needed but if I remove it it dont change anything / tried to do it before or after adding to layout

    w.setLayout(hl); // if called before adding content it dont change

    w.show();
    return a.exec();
}

在这里你可以找到我的自定义小部件:

class WindingViewer : public QWidget
{
    Q_OBJECT
public:
    explicit WindingViewer(QWidget *parent = nullptr);

protected:
    void paintEvent(QPaintEvent *event) override;

signals:
public :
    int SlotNumber;
public slots:
};

WindingViewer::WindingViewer(QWidget *parent) : QWidget(parent)
{
    SlotNumber=3;
    resize(200, 200);
}

void WindingViewer::paintEvent(QPaintEvent *)
{

    int side = qMin(width(), height());
    QColor SlotColor(127, 127, 127);
    QPainter painter(this);
    static const QPoint slotpolygonext[4] = {
        QPoint(-2,85),
        QPoint(-3,95),
        QPoint(3, 95),
        QPoint(2, 85)
    };
    static const QPoint slotpolygonint[5] = {
        QPoint(-1,75),
        QPoint(-2,85),
        QPoint(2, 85),
        QPoint(1, 75),
        QPoint(-1,75),
    };
    painter.setRenderHint(QPainter::Antialiasing);
    painter.translate(width() / 2, height() / 2);
    painter.scale(side / 200.0, side / 200.0);
    painter.setPen(SlotColor);
    for (int i = 0; i < SlotNumber; ++i) {
        painter.drawPolyline(slotpolygonext,4);
        painter.drawPolyline(slotpolygonint,5);
        painter.rotate(360.0/SlotNumber);
    }
}

我希望问题足够清楚。在发布之前,我已经在这里和互联网上搜索了答案。我发现了一些东西,但没有完全相关的东西。

自定义小部件是 window 的一部分,您可以查看是否手动使用鼠标使高度增加。

那为什么要隐藏呢?

布局处理大小策略并使用小部件的 sizeHint() 函数来获取默认大小,在您的情况下 sizeHint() 未实现,因为当 [=显示33=],解决办法是实现那个方法:

*.h

public:
    explicit WindingViewer(QWidget *parent = nullptr);
    QSize sizeHint() const override;

*.cpp

QSize WindingViewer::sizeHint() const
{
    return QSize(200, 200);
}