【问题标题】:Qt window resize aspect ratio 1:1Qt 窗口调整纵横比 1:1
【发布时间】:2019-09-04 08:39:10
【问题描述】:

我想按 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;
};

也许这段代码可以工作,但我的条件 if(event->type() != QEvent::Resize) 不起作用..有什么想法吗?

【问题讨论】:

    标签: qt resize window


    【解决方案1】:

    您的代码中存在一些问题。首先,您应该安装一次事件过滤器,例如在您的构造函数中。您创建一个事件过滤器对象并在每次触发 resizeEvent 时安装它,这是错误的。此外,您正在错误的对象上安装事件过滤器(新的QWidget)。所以去掉resizeEvent函数,插入到Widget的构造函数中:

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

    【讨论】:

    • 谢谢,按照你说的做了,现在可以了。但是如果我增加窗口大小,一切都会按比例进行,但如果你减小它,调整大小将被阻止,并且在程序重新启动之前无法再更改窗口大小。
    猜你喜欢
    • 2020-01-26
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 2022-11-15
    • 2013-02-10
    • 2018-06-11
    相关资源
    最近更新 更多