c++ - 为什么可以从 QWidget 创建对象而无需将其包含在 C++ 程序的开头

标签 c++ qt

这是一个创建 GUI 的简单 Qt C++ 程序。我是一名学生,而且我对 C++ 的熟悉程度不及 Java。在下面显示的代码中,有一个名为*window 的类QWidget 的窗口对象引用,它没有包含在代码的开头。据我所知,所有包含的小部件都在 QWidget(QSlider & QSpinBox) 下。 QWidget 的基类是什么。 (如果QObject和QWidget之间有基类)?为什么可以从 QWidget 创建对象而不包含它?为什么 QWidget 基类整个对象 显示为一个窗口,如果那些其他的 Widget 类在它下面(见下图)。

图片来自 C++-GUI-Programming-with-Qt-4-1st-ed ebook

#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();
}

最佳答案

QSlider 继承自 QAbstractSlider,后者本身继承自 QWidget。所以包含QSlider间接包含了QWidget,允许你创建一个。 QSpinBox 与任何其他小部件一样,也继承自 QWidget

如解释in the doc :

A widget without a parent widget is always an independent window (top-level widget).

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

关于c++ - 为什么可以从 QWidget 创建对象而无需将其包含在 C++ 程序的开头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31557910/

相关文章:

c++ 数组 - 表达式必须有一个常量值

c++ - 为什么指针以半字节而不是数组中的字节递增?

qt - 如何获取 QTableWidget 光标下的行

c++ - Qt C++ - Creation QList<Myclass> - 不是参数 'T 的有效模板类型参数

c++ - 尝试在 Windows 上运行 Qt 应用程序的发布版本时出错

c++ - QSortFilterProxyModel 和插槽 setFilterFixedString

c++ - C++派生类访问基类的好友运算符

c++ - 带有成员函数指针的 boost::tuple

Qt 无模式对话框销毁

c++ - 返回链表中的最大值