Russian Qt Forum
Ноябрь 24, 2024, 06:53 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: resizeEvent в дочернем QWidget  (Прочитано 3606 раз)
oBOXPOH
Гость
« : Май 10, 2017, 11:19 »

Всем здравствуйте!

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

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

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

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

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

Помогите, пожалуйста. Заранее спасибо!
« Последнее редактирование: Май 10, 2017, 11:52 от oBOXPOH » Записан
VPS
Гость
« Ответ #1 : Май 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"
Записан
oBOXPOH
Гость
« Ответ #2 : Май 11, 2017, 09:22 »

У меня такое ощущение, что не работает у меня потому, что созданный виджет я по сути создаю не в конструкторе, а при вызове определённой функции в родительском окне. Попробую сделать всё в конструкторе. В любом случае спасибо хоть за какой-то ответ.
Записан
VPS
Гость
« Ответ #3 : Май 11, 2017, 10:49 »

У меня такое ощущение, что не работает у меня потому, что созданный виджет я по сути создаю не в конструкторе, а при вызове определённой функции в родительском окне. Попробую сделать всё в конструкторе. В любом случае спасибо хоть за какой-то ответ.
Если всё правильно делаете, то всё-равно должно работать.
Покажите неработающий код.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Май 11, 2017, 12:27 »

В любом случае спасибо хоть за какой-то ответ.
Без тестового примера (в виде zip файла) трудно рассчитывать на большее
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.054 секунд. Запросов: 23.