добавление собственного виджета в Layout при исполнении в Qt - PullRequest
0 голосов
/ 26 августа 2018

Я новичок в Qt, но не нов в C ++.

Я нахожусь под Ubuntu 18.04 и использую последний QtCreator с последней платформой Qt5

Я пытаюсь настроить вертикальный макет с горизонтальным вложенным макетом и под заказным виджетом (на данный момент на примере часов)

Я установил новый проект виджета, но, поскольку я пока не понимаю, как получить доступ к вложенному макету из кода C ++, я удалил автоматически созданную основную форму и созданный макет при исполнении.

Если я использую свой пользовательский виджет в качестве окна, оно работает, если я использую окно и добавляю свой пользовательский виджет, это работает, но если я добавляю макет, добавляю свой пользовательский виджет в этот макет и вызываю 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);
    }
}

Надеюсь, вопрос достаточно ясен. Я ищу ответ здесь и через Интернет перед публикацией. Я нашел несколько вещей, но ничего общего не было.

1 Ответ

0 голосов
/ 26 августа 2018

Пользовательский виджет является частью окна, вы можете видеть, если вручную с помощью мыши вы увеличиваете высоту.

И тогда почему он скрыт?

Макеты обрабатывают политики размеров и используют функцию sizeHint() виджетов для получения размера по умолчанию, и в вашем случае sizeHint() не реализован, поскольку он не наблюдается при отображении окна, решение состоит в том, чтобы реализовать этометод:

*. ч

public:
    explicit WindingViewer(QWidget *parent = nullptr);
    QSize sizeHint() const override;

*. cpp

QSize WindingViewer::sizeHint() const
{
    return QSize(200, 200);
}

enter image description here

...