混淆

2012-01-02 197 views
1

我的编码习惯使用Qt可以被描述为在QMainWindow中构造的“新”使用的UI组件如下:混淆

  1. 如果控件将被积极使用(如A QLineEdit提供文本),我在头文件中声明它,然后在MainWindow.cpp中初始化它。 例如TextEditor.h:

class TextEditor { //other code private: QLineEdit edtFind; };

2。如果一个部件是不会被使用(例如QLabelQWidget),或它的一个信号时隙系统(例如QPushButton)的一部分,我声明和使用新的inialise它在构造函数中。

-e.g.

TextEditor::TextEditor() 
{ 
    //other code 
    QWidget* searchPanel = new QWidget(); 
    edtFind = new QLineEdit("Enter Search Term"); 
    QPushButton* findButton = new QPushButton("Find"); 
    connect(findButton,SIGNAL(pressed()),this,SLOT(find())); 

    ui->statusbar->addPermanentWidget(searchPanel); 
} 

我的问题是,我在第2点使用有效的方法?不从堆中分配内存会更好吗?

谢谢。

+0

使用'new'分配的内存分配在堆上。所以你已经在第二点做到了。顺便说一句,变量应该是类成员,只要它们是该类的_property_,并且变量应该具有最窄的生命周期和范围。 – 2012-01-02 08:44:12

回答

2

您的方法效率不高。

  • 对象有为了避免包含一个头文件
  • 拿着在别处创建的对象的引用,使用前向声明更长的寿命
  • :当你真正需要它们,您应该使用堆中分配的对象

您的方法更复杂,没有任何明显的好处。已知堆很慢,分配大量的小对象已知会将其分解(这可能对您的应用程序没有影响,但这仍然是一种不好的做法)。

+0

非常清楚的要点。谢谢。 – 2012-01-04 17:20:51

1

尽管对C++有很好的建议,但回答1实际上在Qt:QObject的一大部分中是错误的(因为QWidget是从QObject派生的)。如果规则是总是在堆上分配QObject,因为QObject具有基于父的垃圾回收功能(当最顶层的QObject父项被删除时,它会要求所有子项递归地删除它们)。应用程序可能会尝试删除堆栈中的一个对象,这会导致崩溃。

请注意,Qt中的某些操作隐式添加或更改QObject的父级作为副作用(重新设置),例如将小部件添加到布局。但是,这通常记录在API文档中。由于重建对于QWidgets非常常见,因此您不应将它们放在堆栈上。其他QObject派生类更安全,如有疑问,请查阅API文档。