Qt addwidget из функции - PullRequest
       5

Qt addwidget из функции

0 голосов
/ 26 ноября 2018

Для начала я новичок в 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 () - публичная функция void, я вызываю из другого виджета.И в этом случае addWidget (кнопка) не работает.Но при нажатии кнопки я вижу сообщение отладки в журнале.

Как я понимаю, я не могу создать виджет из пользовательской функции, верно?И для этой операции мне нужно использовать другой метод?

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... Это странно, потому что какая-то часть кода работает нормально и укладывается в эту строку ... (возможно, для кого-то это имеет смысл):

введите описание изображения здесь

UPD3:

ОК.В ролях тоже работает.Теперь у меня есть реальная проблема - этот метод почему-то не работает с «продвигаемым» виджетом.Итак, как я впервые создал свой виджет - я создал файл form.ui, изменил его и превратил пустой виджет в mainwindow.ui в свой класс виджетов.Таким образом, я не могу добавить новую кнопку в макет (см. Изображение отладки).

Но если я добавлю виджет следующим образом:

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

Все работает отлично.

...