создать виджет внутри функции класса - PullRequest
0 голосов
/ 07 сентября 2018

Я нахожусь в классе, который имеет дело с простым окном (я начинаю с Qt), но когда я пытаюсь добавить новый виджет (из слота пользовательского класса) в это окно, оно не появляется на окне. Я использую QTextStream, который показывает, что слот вызывается правильно, и случайные координаты являются правами, поэтому я совершенно не понимаю, почему в моем окне нет ничего нового. Более того, при первом вызове слота как функции в ButtonsWindow::ButtonsWindow(QWidget *parent) : QWidget(parent) {} виджет отображается правильно ... У вас есть идеи?

Вот мой код .h:

#ifndef BUTTONSWINDOW_H
#define BUTTONSWINDOW_H

#include <QPushButton>
#include <QGridLayout>
#include <QLabel>
#include <cstdlib>
#include <ctime>
#include <QDebug>
#include <QVector>

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

private:
    QPushButton *testButton;
    QVector<QWidget*> buttonsArray;
signals:

public slots:
    void createNewButton();
}; 

#endif // BUTTONSWINDOW_H

Вот мой код класса .cpp:

#include "buttonswindow.h"

ButtonsWindow::ButtonsWindow(QWidget *parent) : QWidget(parent)
{
    setFixedSize(1000, 300);
    createNewButton();
}

void ButtonsWindow::createNewButton()
{
QWidget *mainWidget = new QWidget(this);
QPalette pal = palette();
pal.setColor(QPalette::Background, Qt::lightGray);
mainWidget->setAutoFillBackground(true);
mainWidget->setPalette(pal);
QGridLayout *layout =  new QGridLayout;

QLabel *text = new QLabel("What to do?");
text->setCursor(Qt::WhatsThisCursor);
QPushButton *addWidget = new QPushButton("Create a new Button");
QObject::connect(addWidget, SIGNAL(pressed()), this, SLOT(createNewButton()));
addWidget->setCursor(Qt::CrossCursor);
QPushButton *removeWidget = new QPushButton("Remove an existing random Button");
removeWidget->setCursor(Qt::ForbiddenCursor);

layout->addWidget(text, 0, 0, 1, 2, Qt::AlignCenter);
layout->addWidget(addWidget, 1, 0, 1, 1, Qt::AlignCenter);
layout->addWidget(removeWidget, 1, 1, 1, 1, Qt::AlignCenter);

mainWidget->setLayout(layout);

int nX = (rand() % this->width() - 2 * mainWidget->width());
nX += mainWidget->width();
int nY = (rand() % this->height() - 2 * mainWidget->height());
nY += mainWidget->height();
mainWidget->move(nX, nY);
QTextStream(stdout) << "check " << nX << " : : " << nY;
buttonsArray.append(mainWidget);
}

Finnaly, вот мой код main.cpp:

#include <QApplication>
#include <QPushButton>
#include "buttonswindow.h"

#include <QGridLayout>

using namespace std;

int main(int argc, char *argv[]) {

    srand(time(0));

    QApplication app(argc, argv);

    ButtonsWindow window;
    window.show();
    return app.exec();
}

1 Ответ

0 голосов
/ 07 сентября 2018

Из документации ...

Если вы добавляете дочерний виджет в уже видимый виджет, вы должны явным образом покажите ребенку, чтобы он был виден.

Так что вам просто нужно добавить

mainWidget->show();

в конце вашей ButtonsWindow::createNewButton реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...