Qt编程中的一个注意事项
Qt GUI编程里,默认根据ui文件生成的窗口部件的构造函数里,大体是这样的:
Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); }
ui对应的就是主窗口容器(个人理解),如果在这个容器之中还有其他元素的话,比如说 tableView、editBox,如果也在构造函数里对它们进行初始化,就应该注意到,初始化的操作代码应该需要写到 ui->setupUi(this) 这一句之后,个人理解是,在这句之前窗口对象上的部件还没有成型,因此不能对它们进行相应操作。给个样例代码:
Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); // ui初始化 model = new QSqlTableModel(this); model->setTable("student"); model->setEditStrategy(QSqlTableModel::OnManualSubmit); model->select(); ui->tableView->setModel(model); // 这一句是对ui上部件tableView的操作 }
如果将 ui->tableView->setModel(model) 这一句放到 ui->setupUi(this) 之前的话,程序运行就会出错,调试会显示 Segmentation Fault, 段错误,就是内存访问错误。因为在ui->setupUi(this) 之前, tableView 这个控件还没有得到初始化,还不存在,而 ui->tableView 这样的操作就没有意义了,自然会发生运行时错误。
所以,有关窗口部件的初始化操作如果要放到主窗口的构造函数里的话,一定要把代码放到 setupUi(this) 之后。