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



我希望在主窗口之前有一个登录对话框,这样如果用户不是管理员,就可以在主窗口上隐藏一些按钮。我的登录表单是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();
}

frmLogin::frmLogin(QWidget parent,MainWindow mainWindow) : QMainWindow(parent), ui(new Ui::frmLogin) {
ui->setupUi(this); 
} 
frmLogin::~frmLogin() { 
delete ui; 
} 
void frmLogin::on_pushButton_clicked() {
MainWindow mainwidow; this->hide(); mainwidow.show(); 
}

当你使用时,你似乎不知道OOP

MainWindow mainwidow; 

您正在创建一个不同于main.cpp的窗口,除了是一个将被删除的本地变量外。frmLogin不应该知道MainWindow的存在,一种表明它已被正确记录的方式是发出信号:

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

frmlogin.cpp

...
void frmLogin::on_pushButton_clicked()
{
if(/*verify is Admin*/){
emit adminSignal();
close();
}
}

然后在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中,你可以根据标志实现一个处理该任务的方法。

主窗口.h

...
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
void enableButtons(bool isAdmin);

mainwindow.cpp

void MainWindow::enableButtons(bool isAdmin){
your_button->setEnabled(isAdmin);
}

frmLogin.h

...
signals:
void adminSignal(bool);

frmLogin.cpp

void frmLogin::on_pushButton_clicked()
{
if(/*verify is Admin*/)
emit adminSignal(true);
else
emit adminSignal(false);
close();
}

main.cpp

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

从CDialog类创建frmLogin窗口。然后在MainWindow之前创建frmLogin对象,并显示带有showModal标志的对话框。这使得对话框等待,直到用户输入数据并按下OK按钮。在MainWindow中创建一个init函数,并将对话框返回值传递给MainWindow对象,在此基础上可以启用/禁用MainWindow中的组件。

#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"

相关内容

  • 没有找到相关文章

最新更新