KEEP K.I.S.S.

tk's blog

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) 之后。