Russian Qt Forum

Qt => Вопросы новичков => Тема начата: oBOXPOH от Мая 10, 2017, 11:19



Название: resizeEvent в дочернем QWidget
Отправлено: oBOXPOH от Мая 10, 2017, 11:19
Всем здравствуйте!

Возникла некоторая проблема. Надеюсь на вашу помощь. Поиск в Интернете не дал положительных результатов.

У меня есть главное окно, производное от QMainWindow (class MainWindow : public QMainWindow). Также у меня есть созданный мною виджет, производный от QWidget (class NewWidget : public QWidget). Этот виджет используется в главном окне MainWindow.

Теперь я хочу в созданном виджете обработать его изменение размера, чтобы изменить позицию элемента, находящегося поверх другого (почти все элементы виджета управляются слоями, но один элемент должен находиться поверх другого, т.е. надо менять его позицию в окне).

У меня это никак не получается. Когда я изменяю размер главного окна, событие QResizeEvent возникает только у MainWindow и не передаётся в дочерний, хотя размеры дочернего виджета меняются (из-за слоёв QHBoxLayout или QVBoxLayout) при изменении размеров окна.

Я в ступоре. Создание обработчика void resizeEvent(QResizeEvent) в дочернем виджете не даёт результатов - он просто не вызывается.

Помогите, пожалуйста. Заранее спасибо!


Название: Re: resizeEvent в дочернем QWidget
Отправлено: VPS от Мая 10, 2017, 20:51
Может что-то не так делаете?
Код:
#include <QApplication>
#include <QLabel>
#include <QMainWindow>
#include <QRegularExpression>
#include <QResizeEvent>
#include <QVBoxLayout>
#include <QWidget>

class ChildWidget : public QWidget
{
Q_OBJECT
public:
explicit ChildWidget(QWidget *parent = 0) :
QWidget(parent)
{
lblSize = new QLabel("Child Widget Size: (0 x 0)");
lblSize->setAlignment(Qt::AlignCenter);
lblSize->setStyleSheet("QLabel {"
  "border-style: solid;"
  "border-width: 1px;"
  "border-color: black; "
  "}");

QVBoxLayout *vbxLayout = new QVBoxLayout();
vbxLayout->addWidget(lblSize);

setLayout(vbxLayout);
}

protected:
void resizeEvent(QResizeEvent *event) override
{
QString sizeText = QString("%1 x %2").arg(event->size().width()).arg(event->size().height());
lblSize->setText(lblSize->text().replace(QRegularExpression("\\d+\\sx\\s\\d+"), sizeText));
}

private:
QLabel *lblSize;
};

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
MainWindow(QWidget *parent = 0) :
QMainWindow(parent)
{
setCentralWidget(new ChildWidget());
}
};

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

MainWindow w;
w.show();

return a.exec();
}

#include "main.moc"


Название: Re: resizeEvent в дочернем QWidget
Отправлено: oBOXPOH от Мая 11, 2017, 09:22
У меня такое ощущение, что не работает у меня потому, что созданный виджет я по сути создаю не в конструкторе, а при вызове определённой функции в родительском окне. Попробую сделать всё в конструкторе. В любом случае спасибо хоть за какой-то ответ.


Название: Re: resizeEvent в дочернем QWidget
Отправлено: VPS от Мая 11, 2017, 10:49
У меня такое ощущение, что не работает у меня потому, что созданный виджет я по сути создаю не в конструкторе, а при вызове определённой функции в родительском окне. Попробую сделать всё в конструкторе. В любом случае спасибо хоть за какой-то ответ.
Если всё правильно делаете, то всё-равно должно работать.
Покажите неработающий код.


Название: Re: resizeEvent в дочернем QWidget
Отправлено: Igors от Мая 11, 2017, 12:27
В любом случае спасибо хоть за какой-то ответ.
Без тестового примера (в виде zip файла) трудно рассчитывать на большее