【发布时间】: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