Qt qwidget 立即出现和消失
Qt qwidget appearing and disappearing instantly
我正在用 Qt 5.9
编写一个聊天程序。我完成了客户端程序并开始改进它。我做的第一件事是制作一个新的 Qwidget
(辅助 window),当按下主 window 上的连接按钮时它会出现。一切正常,但是当我测试并按下主 window 上的连接按钮时,我的辅助 window 出现并立即消失。在用户按下按钮(位于辅助 window 上)时,如何让辅助 window 保持(不消失)?这是我的 windows 的代码: main window.h (fenClient.h
):
#ifndef FENCLIENT_H
#define FENCLIENT_H
#include <QtWidgets>
#include <QtNetwork>
#include <ui_fenclient.h>
#include <fenconnexion.h>
class FenClient : public QWidget, private Ui::FenClient
{
Q_OBJECT
public:
FenClient();
~FenClient();
private slots:
void on_boutonConnexion_clicked();
void on_boutonEnvoyer_clicked();
void on_message_returnPressed();
void donneesRecues();
void connecte();
void deconnecte();
void erreurSocket(QAbstractSocket::SocketError erreur);
private:
QTcpSocket *socket;
quint16 tailleMessage;
};
#endif // FENCLIENT_H
#include <fenclient.h>
main window.cpp (fenClient.cpp) 这是创建辅助window的地方.
FenClient::FenClient()
{
setupUi(this);
socket = new QTcpSocket;
connect(socket,SIGNAL(readyRead()),this,SLOT(donneesRecues()));
connect(socket,SIGNAL(connected()),this,SLOT(connecte()));
connect(socket,SIGNAL(disconnected()),this,SLOT(deconnecte()));
connect(socket,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(erreurSocket(QAbstractSocket::SocketError)));
tailleMessage = 0;
}
void FenClient::on_boutonConnexion_clicked()
{
listeMessages->append(tr("<em>Tentative de connexion en cours...</em>"));
boutonConnexion->setEnabled(false);
fenConnexion *fenetreCo = new fenConnexion; //this is where my secondary window is created
fenetreCo->show();
fenetreCo->activateWindow();
fenetreCo->setParent(this);
fenetreCo->echangerPseudo(pseudo->text());
socket->abort();
socket->connectToHost(serveurIP->text(),serveurPort->value());
}
void FenClient::on_boutonEnvoyer_clicked()
{
if (message->text().isEmpty())
{
QMessageBox::information(this,"Veuillez écrire quelque chose","Pour éviter le spam, j'ai decidé d'empecher l'envoi de message vide. Veuillez écrire quelque chose...");
}
else if(pseudo->text() == "")
{
QMessageBox::information(this,"Veuillez spécifier votre nom","Pour éviter l'anonimité, j'ai décidé d'obligé l'usage d'un pseudo.");
}
else
{
QByteArray paquet;
QDataStream out(&paquet, QIODevice::WriteOnly);
QString messageAEnvoyer = tr("<strong>") + pseudo->text() + tr("</strong> : ") + message->text();
out<<(quint16) 0;
out<< messageAEnvoyer ;
out.device()->seek(0);
out << (quint16) (paquet.size() - sizeof(quint16));
socket->write(paquet);
message->clear();
message->setFocus();
}
}
void FenClient::on_message_returnPressed()
{
on_boutonEnvoyer_clicked();
}
void FenClient::donneesRecues()
{
QDataStream in(socket);
if (tailleMessage==0)
{
if(socket->bytesAvailable() < (int)sizeof(quint16))
{return;}
in >> tailleMessage;
}
if (socket->bytesAvailable() < tailleMessage)
{return;}
QString messageRecu;
in >> messageRecu;
listeMessages->append(messageRecu);
tailleMessage = 0;
}
void FenClient::connecte()
{
listeMessages->append(tr("<em>Connexion réussie</em>"));
boutonConnexion->setEnabled(true);
message->setEnabled(true);
}
void FenClient::deconnecte()
{
listeMessages->append(tr("<em>Déconnecté!</em>"));
message->setEnabled(false);
}
void FenClient::erreurSocket(QAbstractSocket::SocketError erreur)
{
switch(erreur)
{
case QAbstractSocket::HostNotFoundError:
listeMessages->append(tr("<em>ERREUR : le serveur n'a pas pu être trouvé. Vérifiez l'IP et le port.</em>"));
break;
case QAbstractSocket::ConnectionRefusedError:
listeMessages->append(tr("<em>ERREUR : le serveur a refusé la connexion. Vérifiez si le programme \"serveur\" a bien été lancé. Vérifiez aussi l'IP et le port.</em>"));
break;
case QAbstractSocket::RemoteHostClosedError:
listeMessages->append(tr("<em>ERREUR : le serveur a coupé la connexion.</em>"));
break;
default:
listeMessages->append(tr("<em>ERREUR : ") + socket->errorString() + tr("</em>"));
}
boutonConnexion->setEnabled(true);
}
FenClient::~FenClient()
{}
中学window.h (fenconnexion.h)
#ifndef FENCONNEXION_H
#define FENCONNEXION_H
#include <ui_fenconnexion.h>
#include <QtWidgets>
class fenConnexion : public QWidget, private Ui::Form
{
Q_OBJECT
public:
fenConnexion();
QString pseudoUtilisateur;
void echangerPseudo(QString pseudoAEchanger);
private slots :
void checkPseudo();
private:
QString pseudo;
};
#endif // FENCONNEXION_H
中学window.cpp (fenconnexion.cpp)
#include <fenconnexion.h>
fenConnexion::fenConnexion()
{ setupUi(this);
connect(boutonInserer,SIGNAL(clicked(bool)),this,SLOT(checkPseudo()));
}
void fenConnexion::checkPseudo()
{
pseudo=pseudoInsere->text();
if (pseudo.isEmpty())
{
QMessageBox::information(this,"Probleme","Veuillez entre un pseudo conetenant au moins un caractere.");
}
else
{
pseudoUtilisateur=pseudo;
pseudoInsere->clear();
pseudo.clear();
this->close();
}
}
void fenConnexion::echangerPseudo(QString pseudoAEchanger)
{
pseudoAEchanger.clear();
pseudoAEchanger = pseudoUtilisateur;
}
我觉得我犯了一个很简单的错误,但由于我已经超过 6 个月没有使用 Qt,所以我似乎没有找到它。
在尝试显示之前,您需要确保已正确设置 window。
fenConnexion *fenetreCo = new fenConnexion;
fenetreCo->show();
fenetreCo->activateWindow();
fenetreCo->setParent(this);
在调用 show
之前设置 window 的 parent。这使得 window this
' child,这意味着 this
' 有责任管理其 life-cycle.
我正在用 Qt 5.9
编写一个聊天程序。我完成了客户端程序并开始改进它。我做的第一件事是制作一个新的 Qwidget
(辅助 window),当按下主 window 上的连接按钮时它会出现。一切正常,但是当我测试并按下主 window 上的连接按钮时,我的辅助 window 出现并立即消失。在用户按下按钮(位于辅助 window 上)时,如何让辅助 window 保持(不消失)?这是我的 windows 的代码: main window.h (fenClient.h
):
#ifndef FENCLIENT_H
#define FENCLIENT_H
#include <QtWidgets>
#include <QtNetwork>
#include <ui_fenclient.h>
#include <fenconnexion.h>
class FenClient : public QWidget, private Ui::FenClient
{
Q_OBJECT
public:
FenClient();
~FenClient();
private slots:
void on_boutonConnexion_clicked();
void on_boutonEnvoyer_clicked();
void on_message_returnPressed();
void donneesRecues();
void connecte();
void deconnecte();
void erreurSocket(QAbstractSocket::SocketError erreur);
private:
QTcpSocket *socket;
quint16 tailleMessage;
};
#endif // FENCLIENT_H
#include <fenclient.h>
main window.cpp (fenClient.cpp) 这是创建辅助window的地方.
FenClient::FenClient()
{
setupUi(this);
socket = new QTcpSocket;
connect(socket,SIGNAL(readyRead()),this,SLOT(donneesRecues()));
connect(socket,SIGNAL(connected()),this,SLOT(connecte()));
connect(socket,SIGNAL(disconnected()),this,SLOT(deconnecte()));
connect(socket,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(erreurSocket(QAbstractSocket::SocketError)));
tailleMessage = 0;
}
void FenClient::on_boutonConnexion_clicked()
{
listeMessages->append(tr("<em>Tentative de connexion en cours...</em>"));
boutonConnexion->setEnabled(false);
fenConnexion *fenetreCo = new fenConnexion; //this is where my secondary window is created
fenetreCo->show();
fenetreCo->activateWindow();
fenetreCo->setParent(this);
fenetreCo->echangerPseudo(pseudo->text());
socket->abort();
socket->connectToHost(serveurIP->text(),serveurPort->value());
}
void FenClient::on_boutonEnvoyer_clicked()
{
if (message->text().isEmpty())
{
QMessageBox::information(this,"Veuillez écrire quelque chose","Pour éviter le spam, j'ai decidé d'empecher l'envoi de message vide. Veuillez écrire quelque chose...");
}
else if(pseudo->text() == "")
{
QMessageBox::information(this,"Veuillez spécifier votre nom","Pour éviter l'anonimité, j'ai décidé d'obligé l'usage d'un pseudo.");
}
else
{
QByteArray paquet;
QDataStream out(&paquet, QIODevice::WriteOnly);
QString messageAEnvoyer = tr("<strong>") + pseudo->text() + tr("</strong> : ") + message->text();
out<<(quint16) 0;
out<< messageAEnvoyer ;
out.device()->seek(0);
out << (quint16) (paquet.size() - sizeof(quint16));
socket->write(paquet);
message->clear();
message->setFocus();
}
}
void FenClient::on_message_returnPressed()
{
on_boutonEnvoyer_clicked();
}
void FenClient::donneesRecues()
{
QDataStream in(socket);
if (tailleMessage==0)
{
if(socket->bytesAvailable() < (int)sizeof(quint16))
{return;}
in >> tailleMessage;
}
if (socket->bytesAvailable() < tailleMessage)
{return;}
QString messageRecu;
in >> messageRecu;
listeMessages->append(messageRecu);
tailleMessage = 0;
}
void FenClient::connecte()
{
listeMessages->append(tr("<em>Connexion réussie</em>"));
boutonConnexion->setEnabled(true);
message->setEnabled(true);
}
void FenClient::deconnecte()
{
listeMessages->append(tr("<em>Déconnecté!</em>"));
message->setEnabled(false);
}
void FenClient::erreurSocket(QAbstractSocket::SocketError erreur)
{
switch(erreur)
{
case QAbstractSocket::HostNotFoundError:
listeMessages->append(tr("<em>ERREUR : le serveur n'a pas pu être trouvé. Vérifiez l'IP et le port.</em>"));
break;
case QAbstractSocket::ConnectionRefusedError:
listeMessages->append(tr("<em>ERREUR : le serveur a refusé la connexion. Vérifiez si le programme \"serveur\" a bien été lancé. Vérifiez aussi l'IP et le port.</em>"));
break;
case QAbstractSocket::RemoteHostClosedError:
listeMessages->append(tr("<em>ERREUR : le serveur a coupé la connexion.</em>"));
break;
default:
listeMessages->append(tr("<em>ERREUR : ") + socket->errorString() + tr("</em>"));
}
boutonConnexion->setEnabled(true);
}
FenClient::~FenClient()
{}
中学window.h (fenconnexion.h)
#ifndef FENCONNEXION_H
#define FENCONNEXION_H
#include <ui_fenconnexion.h>
#include <QtWidgets>
class fenConnexion : public QWidget, private Ui::Form
{
Q_OBJECT
public:
fenConnexion();
QString pseudoUtilisateur;
void echangerPseudo(QString pseudoAEchanger);
private slots :
void checkPseudo();
private:
QString pseudo;
};
#endif // FENCONNEXION_H
中学window.cpp (fenconnexion.cpp)
#include <fenconnexion.h>
fenConnexion::fenConnexion()
{ setupUi(this);
connect(boutonInserer,SIGNAL(clicked(bool)),this,SLOT(checkPseudo()));
}
void fenConnexion::checkPseudo()
{
pseudo=pseudoInsere->text();
if (pseudo.isEmpty())
{
QMessageBox::information(this,"Probleme","Veuillez entre un pseudo conetenant au moins un caractere.");
}
else
{
pseudoUtilisateur=pseudo;
pseudoInsere->clear();
pseudo.clear();
this->close();
}
}
void fenConnexion::echangerPseudo(QString pseudoAEchanger)
{
pseudoAEchanger.clear();
pseudoAEchanger = pseudoUtilisateur;
}
我觉得我犯了一个很简单的错误,但由于我已经超过 6 个月没有使用 Qt,所以我似乎没有找到它。
在尝试显示之前,您需要确保已正确设置 window。
fenConnexion *fenetreCo = new fenConnexion;
fenetreCo->show();
fenetreCo->activateWindow();
fenetreCo->setParent(this);
在调用 show
之前设置 window 的 parent。这使得 window this
' child,这意味着 this
' 有责任管理其 life-cycle.