Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何从自定义小部件类更改中心小部件?_C++_Qt - Fatal编程技术网

C++ 如何从自定义小部件类更改中心小部件?

C++ 如何从自定义小部件类更改中心小部件?,c++,qt,C++,Qt,我从Qt开始。之前我使用JavaSwing,通过卡片布局实现了这一点。我有主窗口、登录小部件和仪表板小部件 main window.cpp MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); // set login screen on startup QWidget *login

我从Qt开始。之前我使用JavaSwing,通过卡片布局实现了这一点。我有主窗口、登录小部件和仪表板小部件

main window.cpp

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

    // set login screen on startup
    QWidget *login = new Login(this);
    setCentralWidget(login);
}
#include "login.h"
#include "ui_login.h"

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

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

void Login::on_loginButton_clicked()
{
    // some logic
    // here I want to create Dashboard widget in central widget
    // but method setCentralWidget() can't be called from here
}
Login.cpp

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

    // set login screen on startup
    QWidget *login = new Login(this);
    setCentralWidget(login);
}
#include "login.h"
#include "ui_login.h"

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

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

void Login::on_loginButton_clicked()
{
    // some logic
    // here I want to create Dashboard widget in central widget
    // but method setCentralWidget() can't be called from here
}

您希望使用信号和插槽在窗口之间进行通信。QDialog特别提供了三个重要信号:accepted()、rejected()、finished(int)。因此,您需要执行以下操作:

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

    // set login screen on startup
    QWidget *login = new Login(this);
    connect(login, SIGNAL(finished(int)), this, SLOT(loginFinished(int)));

    setCentralWidget(login);
}

MainWindow::loginFinished(int reason)
{
    Login *login = qobject_cast<Login*>(sender());
    if (!login) {
        qDebug() << "something bad happened!";
        return;
    }

    login->deleteLater();
    setCentralWidget(someOtherWidget);
}
MainWindow::MainWindow(QWidget*父项)
:QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
用户界面->设置用户界面(此);
//启动时设置登录屏幕
QWidget*登录=新登录(此);
连接(登录,信号(完成(int)),此,插槽(登录完成(int));
setCentralWidget(登录);
}
MainWindow::loginFinished(内部原因)
{
Login*Login=qobject_cast(sender());
如果(!登录){
qDebug()deleteLater();
setCentralWidget(someOtherWidget);
}