gpt4 book ai didi

qt - QWidget::resizeEvent() 未在子类中调用

转载 作者:行者123 更新时间:2023-12-04 05:37:39 26 4
gpt4 key购买 nike

我有以下片段:

    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);

}

调用 setGeometryA 的实例上会火 resizeEvent() .调用 setGeometry在 B 的实例上不会触发 resizeEvent() .这有什么问题吗?

编辑:
我可以在 setGeometry 中进行我需要的相同计算成功地。现在,我的只是好奇。

最佳答案

上面的代码片段有一些问题,所以我在几个地方修改了它……下面的代码是产生你想要的行为所必需的最少代码。

标题:

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 :

    When changing the geometry, the widget, if visible, receives a move event (moveEvent()) and/or a resize event (resizeEvent()) immediately. If the widget is not currently visible, it is guaranteed to receive appropriate events before it is shown.



    如果您的小部件没有父级设置几何形状,则一半毫无意义,如 xy部分是指它相对于父级的位置。最重要的是,由于小部件没有父级,因此它们不能作为应用程序的一部分可见,因此 Qt 不会费心调用适当的 resizeEvent()。 .
  • 关于qt - QWidget::resizeEvent() 未在子类中调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11716919/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com