C++ 在主窗口前显示登录对话框并隐藏主窗口按钮
我想在主窗口之前有一个登录对话框,所以若用户不是管理员,那个么在主窗口上隐藏一些按钮。我的登录表单是frmLoginC++ 在主窗口前显示登录对话框并隐藏主窗口按钮,c++,qt,C++,Qt,我想在主窗口之前有一个登录对话框,所以若用户不是管理员,那个么在主窗口上隐藏一些按钮。我的登录表单是frmLogin int main(int argc, char *argv[]) { QApplication a(argc, argv); QSplashScreen *splash = new QSplashScreen; splash->setPixmap(QPixmap(":/pic/salek.jpg")); splash->sh
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QSplashScreen *splash = new QSplashScreen;
splash->setPixmap(QPixmap(":/pic/salek.jpg"));
splash->show();
QFile styleFile( ":/css/coffee.qss" );
styleFile.open( QFile::ReadOnly );
QString style( styleFile.readAll() );
MainWindow w;
QTimer::singleShot(2500,splash,SLOT(close()));
QTimer::singleShot(2500,&w,SLOT(show()));
w.setStyleSheet( style );
//w.show();
w.setFixedSize(w.size());
return a.exec();
}
从CDialog类创建frmLogin窗口。然后在主窗口之前创建frmLogin对象,并使用showmodel标志显示对话框。这使得对话框等待用户输入数据并按下OK按钮。 在MainWindow中创建一个init函数,并将对话框返回值传递给MainWindow对象,在此基础上,您可以启用/禁用MainWindow中的组件。
\include
#include <QMainWindow>
#include <QApplication>
#include <QInputDialog>
#include <QPushButton>
class MyWindow : public QMainWindow
{
Q_OBJECT
public:
MyWindow() :
QMainWindow(),
mButton(new QPushButton("Told you say hello"))
{
setCentralWidget(mButton);
}
protected:
void showEvent(QShowEvent *event) override {
const QString& s = QInputDialog::getText(this, "", "Say Hello");
mButton->setVisible(s != "Hello");
QMainWindow::showEvent(event);
}
private:
QPushButton* mButton;
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyWindow w;
w.show();
return a.exec();
}
#include "main.moc"
#包括
#包括
#包括
类MyWindow:公共QMainWindow
{
Q_对象
公众:
MyWindow():
QMainWindow(),
mButton(新的QPushButton(“告诉你说你好”))
{
setCentralWidget(mButton);
}
受保护的:
作废showEvent(QShowEvent*事件)覆盖{
const QString&s=QInputDialog::getText(this,“,”Say Hello”);
mButton->setVisible(s!=“你好”);
QMainWindow::showEvent(事件);
}
私人:
QPushButton*mButton;
};
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
我的窗口w;
w、 show();
返回a.exec();
}
#包括“main.moc”
使用以下命令时,您似乎不了解OOP:
MainWindow mainwidow;
您正在创建一个不同于main.cpp的窗口,此外,一个局部变量也将被删除。frmLogin不应该知道主窗口的存在,一种表明它已正确记录的方式是发出一个信号:
frmlogin.h
#ifndef FRMLOGIN_H
#define FRMLOGIN_H
#include <QMainWindow>
namespace Ui {
class frmLogin;
}
class frmLogin : public QMainWindow
{
Q_OBJECT
public:
explicit frmLogin(QWidget *parent = nullptr);
~frmLogin();
signals:
void adminSignal();
private slots:
void on_pushButton_clicked();
private:
Ui::frmLogin *ui;
};
#endif // FRMLOGIN_H
...
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
void enableButtons(bool isAdmin);
...
signals:
void adminSignal(bool);
然后在main.cpp中,我们将使用该信号:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QSplashScreen splash;
splash.setPixmap(QPixmap(":/pic/salek.jpg"));
splash.show();
QFile styleFile( ":/css/coffee.qss" );
styleFile.open(QFile::ReadOnly);
QString style(styleFile.readAll());
MainWindow w;
w.setStyleSheet( style );
frmLogin login;
QTimer::singleShot(2500,&splash, &QSplashScreen::close);
QTimer::singleShot(2500,&login, &QSplashScreen::show);
QObject::connect(&login, &frmLogin::adminSignal, &w, &MainWindow::show);
return a.exec();
}
更新: 如果您想根据条件执行一个或另一个操作,则必须通过信号传递一个标志,并在MainWindow中实现一个根据标志处理该任务的方法 main window.h
#ifndef FRMLOGIN_H
#define FRMLOGIN_H
#include <QMainWindow>
namespace Ui {
class frmLogin;
}
class frmLogin : public QMainWindow
{
Q_OBJECT
public:
explicit frmLogin(QWidget *parent = nullptr);
~frmLogin();
signals:
void adminSignal();
private slots:
void on_pushButton_clicked();
private:
Ui::frmLogin *ui;
};
#endif // FRMLOGIN_H
...
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
void enableButtons(bool isAdmin);
...
signals:
void adminSignal(bool);
main window.cpp
...
void frmLogin::on_pushButton_clicked()
{
if(/*verify is Admin*/){
emit adminSignal();
close();
}
}
void MainWindow::enableButtons(bool isAdmin){
your_button->setEnabled(isAdmin);
}
void frmLogin::on_pushButton_clicked()
{
if(/*verify is Admin*/)
emit adminSignal(true);
else
emit adminSignal(false);
close();
}
QTimer::singleShot(2500,&splash, &QSplashScreen::close);
QTimer::singleShot(2500,&login, &QSplashScreen::show);
QObject::connect(&login, &frmLogin::adminSignal, [&w](bool isAdmin){
w.show();
});
QObject::connect(&login, &frmLogin::adminSignal, &w, &MainWindow::enableButtons);
frmLogin.h
#ifndef FRMLOGIN_H
#define FRMLOGIN_H
#include <QMainWindow>
namespace Ui {
class frmLogin;
}
class frmLogin : public QMainWindow
{
Q_OBJECT
public:
explicit frmLogin(QWidget *parent = nullptr);
~frmLogin();
signals:
void adminSignal();
private slots:
void on_pushButton_clicked();
private:
Ui::frmLogin *ui;
};
#endif // FRMLOGIN_H
...
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
void enableButtons(bool isAdmin);
...
signals:
void adminSignal(bool);
frmLogin.cpp
...
void frmLogin::on_pushButton_clicked()
{
if(/*verify is Admin*/){
emit adminSignal();
close();
}
}
void MainWindow::enableButtons(bool isAdmin){
your_button->setEnabled(isAdmin);
}
void frmLogin::on_pushButton_clicked()
{
if(/*verify is Admin*/)
emit adminSignal(true);
else
emit adminSignal(false);
close();
}
QTimer::singleShot(2500,&splash, &QSplashScreen::close);
QTimer::singleShot(2500,&login, &QSplashScreen::show);
QObject::connect(&login, &frmLogin::adminSignal, [&w](bool isAdmin){
w.show();
});
QObject::connect(&login, &frmLogin::adminSignal, &w, &MainWindow::enableButtons);
main.cpp
...
void frmLogin::on_pushButton_clicked()
{
if(/*verify is Admin*/){
emit adminSignal();
close();
}
}
void MainWindow::enableButtons(bool isAdmin){
your_button->setEnabled(isAdmin);
}
void frmLogin::on_pushButton_clicked()
{
if(/*verify is Admin*/)
emit adminSignal(true);
else
emit adminSignal(false);
close();
}
QTimer::singleShot(2500,&splash, &QSplashScreen::close);
QTimer::singleShot(2500,&login, &QSplashScreen::show);
QObject::connect(&login, &frmLogin::adminSignal, [&w](bool isAdmin){
w.show();
});
QObject::connect(&login, &frmLogin::adminSignal, &w, &MainWindow::enableButtons);
你的问题是什么?我用Mainwindow制作了我的程序。主窗口显示首先我想要一个登录对话框之前。当我按下对话框上的按钮时,在主窗口上隐藏一些按钮并隐藏,主窗口显示。这个对话框在哪里?我不知道如何调用它并从中获取主窗口ui元素。显示frmLogin代码如果frmLogin的条件不满足,如何停用主窗口上的pushbotton?我们有管理员用户和用户。管理员用户拥有对程序按钮的所有访问权限。是否可以将主窗口设为frmLogin的父窗口并访问ui元素?@BehruzMontazeri主窗口的ui元素是私有属性,因此即使您通过相同的主窗口,您也无法访问它们,它的设计也很糟糕,在Qt中,首选使用信号。几乎没有。但是我得到了这个错误:错误:没有匹配的函数来调用'QObject::connect(frmLogin*,MainWindow*,void(QWidget::*)())'QObject::connect(&login,&frmLogin::adminSignal,&w,&MainWindow::show)^