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