当前位置: 代码迷 >> QT开发 >> QT 为啥QWidget对QFrame Resize事件过滤,在QMainWindow中却可以正常显示
  详细解决方案

QT 为啥QWidget对QFrame Resize事件过滤,在QMainWindow中却可以正常显示

热度:972   发布时间:2016-04-25 02:52:04.0
QT 为什么QWidget对QFrame Resize事件过滤,在QMainWindow中却可以正常显示
首先创建一个QMainWindow子类用于显示
//main.cpp
#include "MainWindow.h"
#include <QtWidgets/QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}
//MainWindow.H
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include "testwidget.h"
#include <QVBoxLayout>
#include <QDockWidget>
#include <QtWidgets/QMainWindow>
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = 0) : QMainWindow(parent)
    {
        setDockOptions(QMainWindow::AnimatedDocks | QMainWindow::AllowTabbedDocks);

        TestWidget* m_pPreviewWnd = new TestWidget(this);//测试窗口
        setCentralWidget(m_pPreviewWnd);

        QDockWidget* newdw = new QDockWidget(this);
        addDockWidget(Qt::BottomDockWidgetArea, newdw);

    }
    ~MainWindow() {}
};
#endif // MAINWINDOW_H
其次创建一个测试窗口用于放在MainWindow中心位置处,其窗口包含一个QFrame控件,创建QFrame子类NFrame用于捕捉事件
//TestWidget.h
#ifndef TESTWIDGET_H
#define TESTWIDGET_H
#include <QWidget>
#include "NFrame.h"
#include <QEvent>
#include <QMessageBox>
#include <QHBoxLayout>
class TestWidget : public QWidget
{
    Q_OBJECT
public:
    TestWidget(QWidget *parent) : QWidget(parent)
    {
        m_pScreen = new NFrame(this);
        m_pScreen->installEventFilter(this);
        QHBoxLayout* pSLayout =  new QHBoxLayout;
        pSLayout->addWidget(m_pScreen);
        setLayout(pSLayout);
    }
    ~TestWidget() {}
protected:
    virtual bool eventFilter(QObject *pWatched, QEvent *pEvent) override
    {
        if (pWatched == m_pScreen)
        {
            if (pEvent->type() == QEvent::Resize)
            {
                return true;
            }
        }
        return QWidget::eventFilter(pWatched, pEvent);
    }
private:
    NFrame* m_pScreen;
};
#endif // TESTWIDGET_H
创建子类
//NFrame.h
#ifndef NFRAME_H
#define NFRAME_H
#include <QFrame>
class NFrame : public QFrame
{
    Q_OBJECT
public:
    NFrame(QWidget *parent) : QFrame(parent)
    {
        setStyleSheet("background-color: rgb(0, 111, 185);");
    }
    ~NFrame() {}
protected:
    virtual void resizeEvent(QResizeEvent* event) override
    {
        return QFrame::resizeEvent(event);
    }
};
#endif // NFRAME_H

结果发现,修改MainWindow的外观大小或其内部布局,并没有触发NFrame的resizeEvent事件,因为在TestWidget的事件过滤器中已经return true,直接屏蔽掉了;但为什么还是可以随窗体改变大小
以下为初始截图:

以下为拖动后截图


------解决思路----------------------
确实是可以正常显示,可能是因为布局了的原因吧。
就像布局了之后不能用resize来设置控件的大小。
你是想实现什么功能??
  相关解决方案