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++ 中,取函数地址必须使用 & 运算符。&究竟是引用还是取址,是根据上下文来判断的。引用的话是必须初始化的

Q:QMetaMethod类型是用来做啥用的?
A:  QMetaMethod 用于实现反射机制,即利用函数名调用一个函数这类功能.
  这个一般是一些高级用法,比如 Qt 4 中的信号槽,实际是用两个字符串进行关联,即 Qt 会记录下,当信号 aSIGNAL 发出时,调用 aSLOT 函数。此时,aSIGNAL 和 aSLOT 在 Qt 内部以字符串的形式存储。当运行时,Qt 发现了 aSIGNAL 信号,则找到其对应的 aSLOT 字符串,此时就利用 QMetaMethod 去调用这个字符串对应的函数。如果感兴趣,可以详细了解下反射机制(不仅是 Qt,可以看看 Java 之类的,会更清晰一些,因为 C++ 语言级别的反射比较弱,所以 Qt 按照 Java 的方式做了增强)。
 

Tips:

一个程序中,在栈上分配太多对象可能会导致栈空间不足,从而程序崩溃。所以要适当的用堆啊。

posted @ 2017-11-02 09:36  深圳地铁Princess  阅读(223)  评论(0编辑  收藏  举报