今天调试移植到Qt的一对话框发现其中添加到QSplitter上的一个列表树未显示出来,查找发现
此要显示的对象是Ui_xxxx的派生类,此派生类的第一父类应为QWidget,而移植时错写成了
QDialog,相应的其构造函数变量初始化处的父类名也错写成了QDialog(Qparent),
改正后可以显示出来了。这里与Qt3to4时的两点移植规则有关:
1. ui的派生类要多重继承,首先继承uic自动生成的Ui_*类的setupUi函数中参数的Qt的
对应类名,其次继承自动生成的Ui_*类,顺序不能反;
2. 派生类的构造函数,首先把在成员变量初始化处的Qt3时使用的父类名改成现继承的
第一个父类名,其次在构造函数第一行中添加setupUi(this);语句。查找此问题过程中
测试发现当把QDialog对象用addWiget()函数加到QSplitter对象中时,创建QDialog
对象时若指定父对象为QSplitter对象,则此QDialog显示不出来,不指定父对象时可以显示
出来。例如,以下语句能正常显示:
QSplitter *spHori = new QSplitter(this,"spHori");
spHori->setOrientation(Qt::Horizontal);
QDialog *dialog = new QDialog();
spHori->addWidget(dialog);
但若将其中的创建QDialog对象语句换成下面一句则QDialog将显示不出来:
QDialog *dialog = new QDialog(spHori);
当然,一般不会这样用,即一般不会把QDialog添加到QSplitter上。