gpt4 book ai didi

c++ - QT 多窗口信号/插槽阻止启动

转载 作者:行者123 更新时间:2023-11-30 03:33:32 27 4
gpt4 key购买 nike

简介

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


我正在创建一个多窗口 QT 项目,其中窗口需要相互通信。在创建这个项目的过程中,我不确定如何让窗口相互通信。幸运的是,我找到了这个链接: 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();
}

最佳答案

您的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);

有了这个更新的机制,问题会在编译时而不是运行时被发现。

关于c++ - QT 多窗口信号/插槽阻止启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42775169/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com