我试图在较小的UI文件中传播大型UI的不同部分,然后在项目中用作QWidgets。
嗯,主要想法是:
Ui::subelement * item;
QWidget * widget;
item->setupUi(widget);
widget->show();
但由于某种原因,我无法启动setupUi()两次以上。
一旦它ui> setupUi(this),第二次是ui_Menu。此后,该程序意外结束。
如果一步一步,这是我的代码:
#include "ui_AdminManager.h"
#include "ui_AdminArea.h"
#include "ui_Menu.h"
...
class AdminManager : public QDialog {
Q_OBJECT
public:
explicit AdminManager(QWidget *parent = 0);
~AdminManager();
private:
Ui::AdminManager * ui;
Ui::AdminArea * ui_adminArea;
Ui::Menu * ui_Menu;
之后我尝试初始化小部件并显示它们:
AdminManager::AdminManager(QWidget *parent) : QDialog(parent), ui(new Ui::AdminManager) {
ui->setupUi(this);
QObject::connect(this, SIGNAL(showTab(int)), ui->tabWidget, SLOT(setCurrentIndex(int)));
LOG("hi");
ui_adminArea->setupUi(ui->widgetSelectSite);
ui->widgetSelectSite->show();
LOG("hi");
ui_Menu->setupUi(ui->widget);
ui->widget->show();
LOG("hi");
但是我收到了一个错误,如果我这样做,程序会中断。
Starting /APPS/AdminManager/bin/AdminManager...
../src/AdminManager.cpp 7 AdminManager : hi
The program has unexpectedly finished.
但如果我注释掉一个setupUi()调用,那么一切正常!
AdminManager::AdminManager(QWidget *parent) : QDialog(parent), ui(new
Ui::AdminManager) {
ui->setupUi(this);
QObject::connect(this, SIGNAL(showTab(int)), ui->tabWidget, SLOT(setCurrentIndex(int)));
LOG("hi");
// ui_adminArea->setupUi(ui->widgetSelectSite);
// ui->widgetSelectSite->show();
LOG("hi");
ui_Menu->setupUi(ui->widget);
ui->widget->show();
LOG("hi");
输出:
Starting /APPS/AdminManager/bin/AdminManager...
../src/AdminManager.cpp 7 AdminManager : hi
../src/AdminManager.cpp 11 AdminManager : hi
../src/AdminManager.cpp 15 AdminManager : hi
我爬进了ui_AdminArea.h,看看这个setupUi()做了什么。
放一些qDebug():
class Ui_AdminArea
{
public:
QPushButton *pushButton;
void setupUi(QWidget *AdminArea)
{
qDebug() << 1;
if (AdminArea->objectName().isEmpty())
AdminArea->setObjectName(QStringLiteral("AdminArea"));
qDebug() << 2;
AdminArea->resize(400, 300);
qDebug() << 3;
pushButton = new QPushButton(AdminArea);
qDebug() << 4;
pushButton->setObjectName(QStringLiteral("pushButton"));
qDebug() << 5;
pushButton->setGeometry(QRect(130, 100, 99, 27));
qDebug() << 6;
retranslateUi(AdminArea);
qDebug() << 7;
QMetaObject::connectSlotsByName(AdminArea);
qDebug() << 8;
} // setupUi
void retranslateUi(QWidget *AdminArea) { ... } // retranslateUi
};
这就是我输出的内容:
Starting /APPS/AdminManager/bin/AdminManager...
../src/AdminManager.cpp 7 AdminManager : hi
1
2
3
The program has unexpectedly finished.
事实证明,在 pushButton = new QPushButton(AdminArea)的时刻发生了一些奇怪的事情。
我无法理解。
顺便说一下,在ui_Menu.h中实际上一切都是一样的,一个按钮就是全部......有人可以告诉我如何解决这个问题吗?
PS。这是一个明确的测试项目,具有相同的问题on pastebin
PPS。 for test all files和in one archive
UPD。它解决了。我不是那么喜欢......
Ui::AdminArea * ui_adminArea;
ui_adminArea = new Ui::AdminArea;
ui_adminArea->setupUi(ui->widgetSelectSite);
ui->widgetSelectSite->show();
Ui::Menu * ui_Menu;
ui_Menu = new Ui::Menu;
ui_Menu->setupUi(ui->widget);
ui->widget->show();