【问题标题】:QPushButton to open QWidgetQPushButton 打开 QWidget
【发布时间】:2016-10-25 13:37:33
【问题描述】:

我用 Qt Designer 创建了 2 个窗口,我想在第一个窗口中使用按钮“...”正确打开第二个窗口。我试着这样做,谢谢你的帮助。

firstwindow.cpp

#include "firstwindow.h"
#include "ui_firstwindow.h"
#include "secondwindow.h"
#include "ui_secondwindow.h"

FirstWindow::FirstWindow(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::FirstWindow)
{
    ui->setupUi(this);
    ui->buttonapply->setText("Valider");
    ui->buttoncancel->setText("Annuler");
    ui->buttonetc->setText("...");
    ui->buttonnext->setIcon(QIcon(":/Images/Images/Haut.png"));
    ui->buttonprevious->setIcon(QIcon(":/Images/Images/Bas.png"));

    connect(ui->buttonetc, SIGNAL(clicked()), this, SLOT(ShowSecondWindow()));
}

FirstWindow::~FirstWindow()
{
    delete ui;
}

void    FirstWindow::ShowSecondWindow()
{
    SecondWindow    window;

    window.show();
}

firstwindow.h

#ifndef FIRSTWINDOW_H
#define FIRSTWINDOW_H

#include <QApplication>
#include <QWidget>
#include <QIcon>
#include "secondwindow.h"
#include "ui_secondwindow.h"

namespace Ui {
class FirstWindow;
}

class FirstWindow : public QWidget
{
    Q_OBJECT

public:
    explicit FirstWindow(QWidget *parent = 0);
    ~FirstWindow();

public slots:
    void ShowSecondWindow();

private:
    Ui::FirstWindow *ui;
    SecondWindow *window;
};

#endif // FIRSTWINDOW_H

secondwindow.cpp

#include "firstwindow.h"
#include "ui_firstwindow.h"
#include "secondwindow.h"
#include "ui_secondwindow.h"

SecondWindow::SecondWindow(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::SecondWindow)
{
    ui->setupUi(this);
}

SecondWindow::~SecondWindow()
{
    delete ui;
}

secondwindow.h

#ifndef SECONDWINDOW_H
#define SECONDWINDOW_H

#include <QWidget>
#include "firstwindow.h"
#include "ui_firstwindow.h"

namespace Ui {
class SecondWindow;
}

class SecondWindow : public QWidget
{
    Q_OBJECT

public:
    explicit SecondWindow(QWidget *parent = 0);
    ~SecondWindow();

private:
    Ui::SecondWindow *ui;
};

#endif // SECONDWINDOW_H

ma​​in.cpp

#include "firstwindow.h"
#include "ui_firstwindow.h"
#include "secondwindow.h"
#include "ui_secondwindow.h"

int     main(int argc, char **argv)
{
    QApplication    program(argc, argv);
    FirstWindow     window;

    window.setWindowTitle("BASELFI - Programme - © 2016 H2A");
    window.setWindowIcon(QIcon(":/Images/Images/Bouclier.png"));
    window.setFixedSize(340, 270);
    window.show();
    return program.exec();
}

【问题讨论】:

  • window 是处理程序中的局部变量,因此在函数结束时它会立即被销毁。要么用 new 创建一个 SecondWindow 的实例并将指针存储在某处,要么使用 doModal() 如果第二个窗口是一个对话框并且应该只存在很短的时间。
  • @KarstenKoop,也许你可以写一些代码。这将是未来的一个例子。

标签: c++ qt class qwidget qpushbutton


【解决方案1】:
void FirstWindow::ShowSecondWindow()
    {
        SecondWindow    window;

        window.show();
    }

该函数退出的那一刻,SecondWindow 对象将立即关闭。因为它只在堆栈上创建,超出范围时会自动销毁。

要解决此问题,您必须在堆/堆栈上将其分配为 FirstWindow 类的数据成员或使其成为静态

分配到堆并使其成为数据成员:

class FirstWindow
{
....
private:
     SecondWindow* window; // you must delete this in destructor
};
void FirstWindow::ShowSecondWindow()
{ 
      window = new SecondWindow;
      window->show();
}

或将其设为静态:

void FirstWindow::ShowSecondWindow()
{ 
      static SecondWindow window;
      window.show();
}

或 分配给堆栈并使其成为 FirstWindow 类的数据成员:

class FirstWindow
{
....
private:
     SecondWindow window; // initialize in constructor
};
 void FirstWindow::ShowSecondWindow()
 { 
       window.show();
 }

【讨论】:

  • 谢谢你。
  • @Meugiwara 如果这解决了您的问题,您应该将其标记为已解决
  • 我有完全相同的错误“SecondWindow没有命名类型”,但是你帮我写好了。
  • @Meugiwara 您没有在 OP 上声明它,无论哪种方式都是因为您的 FirstWindow 没有看到您的 SecondWindow 类
  • 我该怎么办,因为我用 Qt Designer 分别创建了两个窗口,我也得到了两个 Qt Designer 界面。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-20
  • 1970-01-01
  • 1970-01-01
  • 2015-05-23
  • 2017-07-29
  • 2020-02-28
相关资源
最近更新 更多