Qt - Как получить реальный размер развернутого окна, на которое у меня есть указатель?

У меня есть метод, который получает указатель на виджет, где должны быть установлены другие виджеты. Мне нужно изменить размер главного окна, где находится этот виджет, и тогда я должен получить реальный размер этого виджета.

Я пытался сделать это так:

void MyClass::setWidgets(QList<QWidget*> list, QWidget *parentWidget)
{
    QWidget* mainWindow = parentWidget->window();
    mainWindow->showMaximized();

    int width = parentWidget->size().width();
    int height = parentWidget->size().height();
    /*... rest of method...*/
}

Этот метод вызывается из другого класса. Но я читал, что нужно ждать resizeEvent. Может ли кто-нибудь объяснить мне, как мне это сделать или есть ли возможность получить этот размер по-другому?


person never_ever    schedule 13.06.2014    source источник


Ответы (1)


Если вы хотите получать события для другого объекта, вы можете установить фильтр событий, используя QObject::installEventFilter.

Простой пример для ResizeEvent:

filter.hpp

#ifndef FILTER_HPP
#define FILTER_HPP

#include <QtGui>

class ResizeFilter : public QObject
{
  Q_OBJECT
  public:
    ResizeFilter();
  protected:
    bool eventFilter(QObject *obj, QEvent *event);
};

#endif

filter.cpp

#include "filter.hpp"

ResizeFilter::ResizeFilter() : QObject() {}

bool ResizeFilter::eventFilter(QObject *obj, QEvent *event)
{
  if (event->type() == QEvent::Resize)
  {
    QResizeEvent* resizeEv = static_cast<QResizeEvent*>(event);
    qDebug() << resizeEv->size();
  }
  return QObject::eventFilter(obj, event);
}

main.cpp

#include <QtGui>
#include "filter.hpp"

int main(int argc, char** argv)
{
  QApplication app(argc, argv);

  ResizeFilter filter;

  QWidget window;
  window.installEventFilter(&filter);
  window.showMaximized();

  return app.exec();
}

filter.pro

TEMPLATE = app
HEADERS = filter.hpp
SOURCES = main.cpp filter.cpp

При тестировании этого на моем ПК он дал вывод:

QSize(840, 420) 
QSize(1280, 952)
person Silas Parker    schedule 13.06.2014