首先创建一个QMainWindow子类用于显示
//main.cpp其次创建一个测试窗口用于放在MainWindow中心位置处,其窗口包含一个QFrame控件,创建QFrame子类NFrame用于捕捉事件
#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
//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来设置控件的大小。
你是想实现什么功能??