Для начала я новичок в 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);
Все работает отлично.