来自功能的Qt addwidget

时间:2018-11-26 13:47:33

标签: c++ qt qt5

首先,我是Qt的新手,我需要一些有关添加小部件的建议。我创建了简单的代码:

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
  ui->setupUi(this);
}

MainWindow::~MainWindow()
{
  delete ui;
}

void MainWindow::AddButtons()
{
  qDebug() << "click";
  QPushButton* button = new QPushButton(this);
  ui->verticalLayout->addWidget(button);
}

void MainWindow::on_blablaButton_clicked()
{
  QPushButton* button = new QPushButton(this);
  ui->verticalLayout->addWidget(button);
}

因此on_blablaButton_clicked()-我是从Design创建的,可以按预期工作。

AddButtons()-公共无效函数,我从另一个小部件调用。在这种情况下,addWidget(button)不起作用。但是单击按钮后可以正常工作,我在日志中看到调试消息。

据我了解,我无法通过自定义函数创建小部件,对吗?而对于此操作,我需要使用其他方法吗?

UPD:

所以我添加了更多调试消息,发现有些奇怪。

我更新的代码:

void MainWindow::AddButtons()
{
qDebug() << "click";
QPushButton* button = new QPushButton(this);
qDebug() << "button name" << button;
ui->verticalLayout->addWidget(button);
qDebug() << "layout count" << ui->verticalLayout->count();
button->show();
qDebug() << "post click";
}

void MainWindow::on_blablaButton_clicked()
{
QPushButton* button = new QPushButton(this);
ui->verticalLayout->addWidget(button);
qDebug() << "layout count" << ui->verticalLayout->count();
}

当我单击自定义功能时,我会在日志中得到它:

click

button name QPushButton(0x2a10a17de10)

layout count 1

post click

click

button name QPushButton(0x2a10a17f4d0)

layout count 1

post click

如果按此按钮(:: on_blablaButton_clicked())

layout count 1

layout count 2

layout count 3

我不明白为什么我的布局数量不同???我想我做错了什么...但是暂时找不到。

UPD2:

在您的帮助下,我明白了。因此,qcast-某些原因没有帮助我(我认为我需要有关此演员表的更多信息)。但是,如果我直接将指针链接(使用MainWindow)添加到我的窗口小部件,那就完美了!

这是在mainwindow.cpp中的外观:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    Form* f = new Form;
    f->Parent = this;
    layout()->addWidget(f);

}

并在我的自定义小部件中...

void Form::on_customWidgetButton_clicked()
{
    //MainWindow* m = new MainWindow();
    //m->AddButtons();

    //MainWindow* m = qobject_cast<MainWindow*>(parentWidget());

    Parent->AddButtons();
}

如您所见,我在qobject_cast上失败了...这很奇怪,因为代码的某些部分可以正常工作并且可以在该行中堆叠...(也许对于有意义的人而言):

enter image description here

UPD3:

好的。演员也可以。现在,我遇到了真正的问题-由于某种原因,此方法不适用于“升级”小部件。因此,我第一次创建小部件的方式-创建了form.ui文件,对其进行了更改,并将mainwindow.ui中的空小部件升级为我的自定义小部件类。这样,我无法在布局中添加新按钮(请参见调试图像)。

但是,如果我以这种方式添加小部件:

Form* f = new Form;
f->Parent = this;
layout()->addWidget(f);

一切正常。

0 个答案:

没有答案