在执行时在布局中添加自定义小部件
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);
}
我在 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);
}