C++ 在主窗口前显示登录对话框并隐藏主窗口按钮

C++ 在主窗口前显示登录对话框并隐藏主窗口按钮,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

我想在主窗口之前有一个登录对话框,所以若用户不是管理员,那个么在主窗口上隐藏一些按钮。我的登录表单是frmLogin

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)^