Qt5使用几个setupUi的问题

时间:2014-07-10 01:04:04

标签: qt user-interface crash qt5 qwidget

我试图在较小的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 filesin 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();

0 个答案:

没有答案