Изменение размера окна Qt 1: 1 - PullRequest
0 голосов
/ 14 апреля 2019

Я хочу изменить размер окна приложения пропорционально 1: 1.Я попытался изменить его внутри ResizeEvent, но затем у меня вспыхнуло окно.Теперь мой код выглядит следующим образом, но он не работает.

filterobject.h:

class FilterObject:public QObject{
public:
    QWidget *target = nullptr;//it holds a pointer to target object
    int goalHeight=0;
    FilterObject(QObject *parent=nullptr):QObject(parent){}//uses QObject constructor
    bool eventFilter(QObject *watched, QEvent *event) override;//and overrides eventFilter function
};

widget.h:

namespace Ui {
class Widget;

}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = nullptr);
    virtual int heightForWidth ( int w ) const { return w*9/16;}
    //virtual void resizeEvent(QResizeEvent *event) override;
    ~Widget();

private:
    Ui::Widget *ui;
};

widget.cpp:

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

void QWidget::resizeEvent(QResizeEvent *event){
   FilterObject *filter = new FilterObject();
   QWidget *targetWidget = new QWidget();
   filter->target=targetWidget;
   targetWidget->installEventFilter(filter);
}

bool FilterObject::eventFilter(QObject *watched, QEvent *event) {
    if(watched != target){//checks for correct target object.
        return false;
    }

    if(event->type() != QEvent::Resize){//and correct event
       return false;
    }

    QResizeEvent *resEvent = static_cast<QResizeEvent*>(event);

    goalHeight = 9*resEvent->size().width()/16;
    if(target->height()!=goalHeight){
        target->setFixedHeight(goalHeight);
    }

    return true;
};

Возможно, этот код будет работать, но мое условие, если (event-> type ()! = QEvent :: Resize) не работает .. Есть идеи?

1 Ответ

0 голосов
/ 14 апреля 2019

У вас есть проблемы в вашем коде. Прежде всего вы должны установить фильтр событий один раз, например, в своем конструкторе. Вы создаете объект фильтра событий и устанавливаете его каждый раз, когда срабатывает resizeEvent, что неправильно. Также вы устанавливаете фильтр событий на неправильный объект (новый QWidget). Поэтому удалите функцию resizeEvent и вставьте в конструктор Widget:

FilterObject *filter = new FilterObject();
filter->target=this;
installEventFilter(filter);
...