Q&A-3:
Q:这样创建的按钮和在ui里拖动创建的有什么区别,为什么ui里(edit signals/slots)的我看不到代码
A:基本没有区别。UI 文件是基于 XML 的描述性文件。Qt 使用特殊的编译器(uic)将 UI 文件翻译成 C++ 源代码,然后再进行编译。使用 UI 文件可以进行快速开发,而直接使用代码创建则更方便进行控制
Q:
启动软件后,东西全部挤叠在在一起了。
还有一个警告:QWidget::setLayout: Attempting to set QLayout “” on MainWindow “”, which already has a layout
A:
注意代码中是QWidget window;
你大概是用成了QMainWindow window
QMainWindow 有自己的布局管理器,所以一般是把你的布局放在一个 QWidget 上,然后将这个 QWidget 设置为 centralWidget
QMainWindow 的确是继承自 QWidget,但是它同时添加了自己的 layout,正因为有 layout 的存在,所以你需要使用 setCentralWidget() 函数把一个 QWidget 设置为中心的组件,而不是把一个个的子组件用自己的 layout 添加进去(因为 QMainWindow 已经有了默认的 layout,你自己的 layout 才会不起作用)。
Q:connect函数第二个参数像这样加个括号就会报错:call to non-static member function without an object argument。请教是什么原因,C++学的不扎实还请见谅
QObject::connect(&button, &(QPushButton::clicked), &QApplication::quit);
A:这里是取函数指针,加上括号后编译器需要先执行括号里面的语句,而这个语句是非法的,所以报错。函数的名称就是函数的地址,但是在 C++ 中,取函数地址必须使用 & 运算符。&究竟是引用还是取址,是根据上下文来判断的。引用的话是必须初始化的
Tips:
一个程序中,在栈上分配太多对象可能会导致栈空间不足,从而程序崩溃。所以要适当的用堆啊。