我有以下代码段:
class A : public QWidget
{
Q_OBJECT
public:
A(QWidget *parent = 0);
void
setGeometry(int x, int y, int w, int h);
protected:
virtual void
resizeEvent(QResizeEvent *event);
}
class B : public A
{
Q_OBJECT
public:
B(A*parent = 0);
void
setGeometry(int x, int y, int w, int h);
protected:
virtual void
resizeEvent(QResizeEvent *event);
}
void
A::setGeometry(int x, int y, int w, int h)
{
QWidget::setGeometry(x, y, w, h);
}
void
A::resizeEvent( QResizeEvent * event)
{
QWidget::resizeEvent(event);
// common A and B stuff
}
void
B::setGeometry(int x, int y, int w, int h)
{
A::setGeometry(x, y, w, h);
}
void
B::resizeEvent( QResizeEvent * event)
{
A::resizeEvent(event);
}
在setGeometry
的实例上调用A
将触发resizeEvent()
。在B实例上调用setGeometry
将不会触发resizeEvent()
。这有什么不对吗?
编辑:
我可以在setGeometry
内成功完成相同的计算。现在,我的只是好奇心。
答案 0 :(得分:3)
上面的代码段存在一些问题,所以我在几个地方对其进行了修改......下面的代码是产生所需行为所需的最低代码。
标题强>
class TestA : public QWidget
{
Q_OBJECT
public:
explicit TestA(QWidget *Parent = 0) : QWidget(Parent) {}
~TestA() {}
protected:
virtual void resizeEvent(QResizeEvent *);
};
class TestB : public TestA
{
Q_OBJECT
public:
explicit TestB(QWidget *Parent = 0) : TestA(Parent) {}
~TestB() {}
protected:
virtual void resizeEvent(QResizeEvent *);
};
<强>实施强>
void TestA::resizeEvent(QResizeEvent *)
{
qDebug() << "TestA Resize";
}
void TestB::resizeEvent(QResizeEvent *)
{
qDebug() << "TestB Resize";
}
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
TestA* A = new TestA(this);
TestB* B = new TestB(this);
A->setGeometry(0,0,100,100);
B->setGeometry(200,200,100,100);
}
<强>的变化:强>
在课程定义中添加Q_OBJECT
macros :
告诉编译器为类添加Qt元对象代码(不是绝对必要的,以确保调用resizeEvent()
,但是对于继承QObject
的对象应该包含在内)。
添加允许传入父对象并使用此父对象调用基类构造函数的构造函数,并在创建它们时将父对象传递给两个对象的构造函数:
来自the docs:
更改几何体时,窗口小部件如果可见,会立即收到移动事件(moveEvent())和/或resize事件(resizeEvent())。如果窗口小部件当前不可见,则保证在显示之前接收适当的事件。
如果您的小部件没有设置父级,那么几何结构将毫无意义,因为x
和y
部分指的是相对于父级的位置。最重要的是,由于小部件没有父母,因此无法将其视为应用程序的一部分,因此Qt无需拨打相应的resizeEvent()
。