为什么可以在C++程序中不包含QWidget的情况下创建一个QWidget对象

3
这是一个简单的Qt C++程序,用于创建GUI。我是一名学生,对C++不如对Java熟悉。在下面的代码中,有一个名为*windowQWidget类的窗口对象引用,该类在代码开头没有包含。据我所知,所有包含的小部件都在QWidget(QSlider & QSpinBox)下面。QWidget的基类是什么(如果在QObject和QWidget之间有一个基类)?为什么可以创建QWidget对象而不包括它?为什么那个QWidget基类的整个对象显示为窗口,而其他小部件类则位于其下方(请参见下面的图像)?
#include <QApplication>
#include <QHBoxLayout>
#include <QSlider>
#include <QSpinBox>

int main(int argc, char *argv[]){

  QApplication app(argc, argv);

  QWidget *window = new QWidget;
  window->setWindowTitle("select your age");


  QSlider *slider = new QSlider(Qt::Horizontal);
  QSpinBox *spin = new QSpinBox;
  slider->setRange(0, 130);
  spin->setRange(0, 130);

  QObject::connect( spin, SIGNAL(valueChanged(int)), slider, SLOT(setValue(int)) );
  QObject::connect( slider, SIGNAL(valueChanged(int)), spin, SLOT(setValue(int)) );

  spin->setValue(30);

  QHBoxLayout *layout = new QHBoxLayout;

  layout->addWidget(spin);
  layout->addWidget(slider);
  window->setLayout(layout);

  window->show();

  return app.exec();
}

你有查看过 http://doc.qt.io/qt-5/qwidget.html#details 吗?“没有嵌入在父窗口中的小部件被称为窗口。” - styko
4个回答

4
QSlider继承自QAbstractSlider,而QAbstractSlider本身则继承自QWidget。因此,包含QSlider也间接包含QWidget,使您能够创建一个。与其他任何部件一样,QSpinBox也继承自QWidget

如文档中所述

没有父窗口小部件始终是独立的窗口(顶级小部件)。

因此QWidget *window实际上创建了一个具有标题栏和所有内容的窗口。

2
Qt文档中:

小部件是用户界面的原子。(...) 小部件 被其父部件和在其前面的小部件所裁剪。

没有嵌入到父小部件中的小部件称为窗口。 (...)

没有父小部件的小部件始终是独立的窗口 (顶级小部件)。

希望这可以帮到您。

这并没有真正回答问题。问题是:“为什么可以在代码中使用QWidget而不需要#include<QWidget>。” - Kuba hasn't forgotten Monica

0
QWidget的基类是什么? QWidget继承自QObject和QPaintDevice。
为什么可以创建一个QWidget对象而不包含它?
我猜<QSlider>和/或<QSpinBox>包含<QWidget>。是的,为了示例的完整性,如果有一个明确的#include <QWidget>也可能更好,但显然并非必要。
为什么整个QWidget显示为窗口,而其他Widget类却在其下面?
抱歉,我不确定你在这里确切地想问什么。

0

QWidget的基类是什么?(如果在QObject和QWidget之间有一个基类)?

我不知道。QWidget是基本GUI类。我的意思是所有其他GUI类都必须从它派生出来。因此,在层次结构链中它上面是什么并不重要。

为什么可以创建一个QWidget对象而不包括它?

我理解你的意思是没有#include QWidget.h就可以创建QWidget对象。QSpinBox和QSlider都是从QWidget派生出来的,所以它们的头文件应该包括QWidget.h。包含是传递的。

为什么整个QWidget显示为窗口,如果其他Widget类都在它下面。 这真的很不清楚。如果一个小部件不包含其他小部件,那么它成为窗口就没有任何意义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接