【问题标题】:QT Multi-window Signal / Slot prevents LaunchQT 多窗口信号/插槽阻止启动
【发布时间】:2017-03-13 23:20:18
【问题描述】:

简介

免责声明:我是 QT 新手,但谁没有学习。


我正在创建一个多窗口 QT 项目,其中窗口需要相互通信。在创建这个项目的过程中,我不确定如何让 windows 相互通信。幸运的是,我找到了这个链接: Passing Data Between Windows


尝试在我的代码中实现它后,我发现它没有响应,并且编译后无法运行。


问题

我相信问题出在下面的代码上。

主窗口构造函数

homeWindow::homeWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::homeWindow)
{
    ui->setupUi(this);
    /* Initialize Windows */
    loginWindow = new login;
    trainerW = new trainer;
    // Show the login window
    loginWindow->setFixedSize(400, 400);
    loginWindow->show();
    // Hide the current window
    this->setVisible(false);
    // Connect the calling of loginRequest in the loginWindow object to the visibility of the home window
    connect(loginWindow, SIGNAL(loginRequest()), this, SLOT(setVisible(true)));
}

登录头文件

 signals:
     void loginRequest();

登录 CPP

#include "login.h"
#include "ui_login.h"
#include <QMessageBox>
#include <QStatusBar>

void login::on_pushButton_login_clicked()
{
    QString username = ui->lineEdit_username->text();
    QString password = ui->lineEdit_password->text();

    if(username == "Test" && password == "test"){
        loginRequest();
    }else{
        ui->label_messegeBar->setText("Username or password is wrong.");
    }
}

我应该使用更好的解决方案吗?我愿意接受所有反馈。

感谢大家的帮助,
macrocypher

编辑

我在启动程序时仍然遇到问题。我做了一些改变。我决定从相关文件中添加我的所有代码,以防出现我不知道的问题。

Main.cpp

#include <QApplication>
#include "homewindow.h"

int mode = 1;

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    // Create homewindow object, calls login in constructer
    homeWindow hWindow;
    hWindow.start();
    return a.exec();
}

主窗口.h

#ifndef HOMEWINDOW_H
#define HOMEWINDOW_H

#include <QMainWindow>
#include <trainer.h>
#include <login.h>

namespace Ui {
class homeWindow;
}

class homeWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit homeWindow(QWidget *parent = 0);
    ~homeWindow();
    void setUserName(QString username);
    void getTrainerData();
    void start();

private slots:
    void on_pushButton_learn_clicked();

private:
    login *loginWindow;
    Ui::homeWindow *ui;
    QString userName;
    trainer *trainerW;
};

#endif // HOMEWINDOW_H

主窗口.cpp

#include "homewindow.h"
#include "ui_homewindow.h"
#include "trainer.h"
#include "session_adjust.h"
#include "login.h"
#include <QDebug>

homeWindow::homeWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::homeWindow)
{
    ui->setupUi(this);
    /* Initialize Windows */
    loginWindow = new login;
    trainerW = new trainer;
    // Hide the current window
    setVisible(false);
    // Connect the calling of loginRequest in the loginWindow object to the visibility of the home window
    connect (loginWindow, &login::loginRequest, this, &homeWindow::setVisible);
}

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

void homeWindow::setUserName(QString username)
{
    userName = username;
    ui->label_userName->setText(username);
}

void homeWindow::start()
{
    // Show the login window
    loginWindow->setFixedSize(400, 400);
    loginWindow->show();
}

void homeWindow::on_pushButton_learn_clicked()
{
    // When learn is clicked, start a new session
    trainerW->show();
    trainerW->startSession();
}

void getTrainerData() {
    //qDebug() << QString::number(trainerW->getIncorrectScore());
    //qDebug() << QString::number(trainerW->getCorrectScore());
}

登录.h

#ifndef LOGIN_H
#define LOGIN_H

#include <QDialog>
//#include <homewindow.h>
//#include <session_adjust.h>

namespace Ui {
class login;
}

class login : public QDialog
{
    Q_OBJECT

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

signals:
    void loginRequest(bool);

private slots:
    void on_pushButton_login_clicked();
    void on_pushButton_quit_clicked();

private:
    Ui::login *ui;
    //session_adjust *sessionW;
    //homeWindow *hWindow;
};

#endif // LOGIN_H

登录.cpp

#include "login.h"
#include "ui_login.h"
#include <QMessageBox>
#include <QStatusBar>

login::login(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::login)
{
    ui->setupUi(this);
    ui->label_messegeBar->setText("");
}

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

void login::on_pushButton_login_clicked()
{
    QString username = ui->lineEdit_username->text();
    QString password = ui->lineEdit_password->text();


    if(username == "Test" && password == "test"){

        /*hWindow = new homeWindow;
        hWindow->show();
        hWindow->setUserName(username);
        login::hide();*/



        /*
        sessionW = new session_adjust;
        sessionW->show();
        login::hide();
        */

        emit loginRequest(true);

    }else{
        //QMessageBox::warning(this, "Login", "Wrong username or password.");
        ui->label_messegeBar->setText("Username or password is wrong.");
        emit loginRequest(false);
    }
}

void login::on_pushButton_quit_clicked()
{
    QApplication::quit();
}

【问题讨论】:

  • 到底是什么问题?
  • 不会启动。它会在我的快捷栏上打开一个图标,但不会完全运行。实施 goug 的答案后,我仍然遇到这个问题。
  • “从不完全运行”是什么意思?它是退出还是只是出现卡住/无响应?如果是后者,那么您应该在调试器下运行它并获取回溯以了解发生了什么。
  • @macrocypher 我会在我的 Qt 5.8 下试试你的代码
  • @macrocypher 我试过你的代码,它工作!登录框(在我的情况下,我选择了 QWidget 而不是 QDialog 也许您应该更改它)正确显示,然后我可以使用凭据 Test:test,.. 在调试模式下显示主窗口,在其中放置一个断点登录窗口->显示();通过后,应该会显示登录框。不要忘记也运行 qmake(它有时可以解决一些奇怪的问题)。

标签: c++ qt signals-slots


【解决方案1】:

您的connect 陈述不正确;你不能把参数值放在那里,只有类型。因此,无法创建连接,因此当您发出信号时没有任何反应。在程序的输出中,您会看到一个错误。你也不能这样做:

connect(loginWindow, SIGNAL(loginRequest()), this, SLOT(setVisible(bool)));

因为setVisible 的参数没有值。您可以做的是更改您的 loginRequest 信号以获取参数:

void loginRequest (bool visible);

那么connect 语句将是:

connect(loginWindow, SIGNAL(loginRequest(bool)), this, SLOT(setVisible(bool)));

emit 将是:

emit loginRequest (true);

如果您使用的是 Qt 5 或更高版本,connect 语句的更好语法是:

connect (loginWindow, &login::loginRequest, this, &homeWindow::setVisible);

使用这种较新的机制,可以在编译时而不是运行时发现问题。

【讨论】:

  • 我仍然面临运行应用程序的问题。你觉得你能帮上忙吗?所有信息都发布在“编辑”标题下的问题中。
  • 所有信息都发布在“编辑”标题下的问题中。 请记住,StackOverflow 不是论坛。每个问题应该是 1 个问题,而不是动态问题,在您获得解决程序中所有错误的有效解决方案之前,问题会不断变化。这样做的目的是为有同样问题的未来读者提供好的问题和答案。
【解决方案2】:

为登录尝试一个新的 UI 类:而不是 QDialog(对话框)选择 QWidget(小部件)。

【讨论】:

  • 这不是他想要的。在登录窗口成功处理用户名/密码之前,主窗口应该保持隐藏状态。
  • @goug 好的,明白了。
  • @goug,我试过了,没问题!
猜你喜欢
  • 1970-01-01
  • 2012-09-11
  • 1970-01-01
  • 2020-10-01
  • 1970-01-01
  • 2012-10-15
  • 2015-07-18
  • 2011-09-06
  • 2013-09-27
相关资源
最近更新 更多