智能客服
你问我答,随时在线为你解决问题
HarmonyOS PC中Qt项目主窗口显示登录模态窗是Qt项目高频使用场景之一,例如实现主页面与登录对话框同时显示,登录后即可显示指定内容,若未登录则以游客模式访问;或者实现模态窗成功登录后才能显示主窗口功能。
本示例基于Qt框架使用QDialog创建登录对话框,并调用exec函数以模态方式显示弹窗,从而显示登录模态窗。
场景一:主窗口与登录模态窗同时显示。

场景二:模态窗成功登录后显示主窗口。

开源版与商业版Qt项目中,cpp目录下的代码实现思路一致。本示例基于开源版Qt实现,具体内容如下:
场景一:主窗口与登录模态窗同时显示。
编写qrc资源文件,并手动创建文件夹后放入图片文件。在img文件夹中放入未登录时的icn.png头像图片及visitor.png图片,已登录时的user.png头像图片及login.png图片。

在CMakeLists.txt文件中,加入所需的cpp文件、头文件及qrc资源文件,部分代码如下:
add_library(qtmodule SHARED main.cpp mainwindow.cpp mainwindow.h logindialog.cpp logindialog.cpp image.qrc)为实现更新登录状态,在mainwindow.cpp中定义了UpdateLoginStatus函数。其核心是根据状态,使用QPixmap从qrc资源加载对应图片并更新显示。代码如下:
void MainWindow::UpdateLoginStatus(bool isLogin)
{
m_isLogin = isLogin;
if (isLogin) {
setWindowTitle("应用主界面 - 已登录");
m_avatarLabel->setPixmap(QPixmap(":/img/user.png"));
m_nameLabel->setText("Test用户");
m_nameLabel->setStyleSheet("font-size: 18px; font-weight: bold; color: #333; margin-top: 8px;");
updateRightImage(":/img/login.png");
} else {
setWindowTitle("应用主界面");
m_avatarLabel->setPixmap(QPixmap(":/img/icn.png"));
m_nameLabel->setText("点击登录");
m_nameLabel->setStyleSheet("font-size: 18px; font-weight: bold; color: #333; margin-top: 8px;");
updateRightImage(":/img/visitor.png");
}
}在QDialog中调用setModal函数设置登录窗口是否为模态窗口,logindialog.cpp文件中部分代码如下:
setModal(true);调用exec函数以模态方式显示弹窗,将阻塞后续代码执行直到关闭弹窗,logindialog.cpp文件中自定义showLogin函数代码如下:
bool LoginDialog::showLogin(QWidget *parent)
{
LoginDialog dlg(parent);
dlg.move(parent->geometry().center() - dlg.rect().center());
bool success = (dlg.exec() == QDialog::Accepted) && dlg.m_isLoginSuccess;
return success;
}main.cpp文件中创建了两个窗口:作为父窗口的主窗口,以及作为子窗口的登录模态窗。核心代码如下:
MainWindow mainWin;
mainWin.show();
bool firstLogin = LoginDialog::showLogin(&mainWin);
mainWin.UpdateLoginStatus(firstLogin);
add_library(qtmodule SHARED main.cpp clickableuserwidget.cpp clickableuserwidget.h logindialog.h logindialog.cpp mainwindow.cpp mainwindow.h image.qrc)void MainWindow::InitTrayIcon()
{
trayIcon = new QSystemTrayIcon(this);
QIcon defaultIcon = qApp->style()->standardIcon(QStyle::SP_ComputerIcon);
trayIcon->setIcon(defaultIcon);
qDebug() << "托盘图标创建完成,是否可见:" << trayIcon->isVisible();
qDebug() << "系统托盘是否可用:" << QSystemTrayIcon::isSystemTrayAvailable();
trayMenu = new QMenu(this);
showWindowAction = new QAction("显示主窗口", trayMenu);
hideWindowAction = new QAction("隐藏主窗口", trayMenu);
exitAction = new QAction("退出程序", trayMenu);
trayMenu->addAction(showWindowAction);
trayMenu->addAction(hideWindowAction);
trayMenu->addAction(exitAction);
trayIcon->setContextMenu(trayMenu);
connect(showWindowAction, &QAction::triggered, this, &MainWindow::OnShowWindow);
connect(hideWindowAction, &QAction::triggered, this, &MainWindow::OnHideWindow);
connect(exitAction, &QAction::triggered, this, &MainWindow::OnExit);
connect(trayIcon, &QSystemTrayIcon::activated, this, &MainWindow::OnTrayActivated);
connect(trayIcon, &QSystemTrayIcon::messageClicked, this, &MainWindow::OnShowWindow);
trayIcon->show();
}QApplication a(argc, argv);
a.setQuitOnLastWindowClosed(false);MainWindow w;
LoginDialog loginDlg;
qDebug() << "登录对话框启动";
int loginResult = loginDlg.exec();
if (loginResult == QDialog::Accepted) {
qDebug() << "登录成功,调用显示主窗口";
w.OnShowWindow();
} else {
qDebug() << "登录取消/失败,退出程序";
return 0;
}使用该示例需要完成下面两个操作:
将libs\arm64-v8a下的libplugins_platforms_qopenharmony.so文件替换为本地Qt安装路径\plugins\platforms目录下的libplugins_platforms_qopenharmony.so,以及将libplugins_imageformats_qjpeg.so文件替换为本地Qt安装路径\plugins\imageformats目录下的libplugins_imageformats_qjpeg.so。
将开源版Qt安装路径配置到QT_PREFIX中,可以选择下面两个方案中的一个:
entry\src\main\cpp\CMakeLists.txt文件,将QT_PREFIX变量的值从"D:\\arkTSProject\\QtSdkOpen\\ohos17_arm64-v8a_release"更新为本地Qt编译输出目录路径: # 检查环境变量是否存在
if(DEFINED ENV{WORKSPACE})
set(QT_PREFIX $ENV{WORKSPACE}/code/SDK/Qt/QtOpenSDK)
message(STATUS "get QT_PREFIX PATH: ${QT_PREFIX}")
else()
set(QT_PREFIX "D:\\arkTSProject\\QtSdkOpen\\ohos17_arm64-v8a_release")
message(STATUS "WORKSPACE not defined, using default path: ${QT_PREFIX}")
endif()entry\src\main\cpp\CMakeLists.txt中的QT_PREFIX定义,在entry\build-profile.json5中设置QT_PREFIX: "buildOption": {
"externalNativeOptions": {
"path": "./src/main/cpp/CMakeLists.txt",
"arguments": "-DQT_PREFIX=D:\\arkTSProject\\QtSdkOpen\\ohos17_arm64-v8a_release",
"cppFlags": "",
"abiFilters": ["arm64-v8a"]
}
},【常见FAQ】
Q:项目运行后,qrc资源文件中的图片为什么无法显示?
A:在libs\arm64-v8a目录中放入本地Qt安装路径\plugins\imageformats目录下的libplugins_imageformats_qjpeg.so即可。
├─entry
│ ├─libs/arm64-v8a
│ │ ├─libplugins_imageformats_qjpeg.so
│ │ └─libplugins_platforms_qopenharmony.so // Qt安装目录'plugins\platforms'HarmonyOS平台插件so
│ └─src
│ ├─main
│ │ ├─cpp
│ │ │ ├─img // 图片文件夹
│ │ │ │ ├─icn.png // 未登录头像图片
│ │ │ │ ├─login.png // 已登录显示图片
│ │ │ │ ├─user.png // 登录头像图片
│ │ │ │ └─visitor.png // 未登录显示图片
│ │ │ ├─CMakeLists.txt // Qt项目CMakeList文件
│ │ │ ├─image.qrc // Qt资源文件
│ │ │ ├─logindialog.cpp // 登录弹窗cpp文件
│ │ │ ├─logindialog.h // 登录弹窗头文件
│ │ │ ├─main.cpp // Qt的主入口
│ │ │ ├─mainwindow.cpp // 主窗口cpp文件
│ │ │ └─mainwindow.h // 主窗口头文件
│ │ ├─ets
│ │ │ ├─abilitystage
│ │ │ │ └─MyAbilityStage.ets
│ │ │ ├─entryability
│ │ │ │ └─EntryAbility.ets // 应用入口
│ │ │ └─pages
│ │ │ └─Index.ets // 主页面实现
│ │ ├─resources // 应用资源目录
│ │ └─module.json5 // 模块级核心配置文件
│ ├─build-profile.json5 // 工程结构/构建/定制化配置信息
│ └─oh-package.json5 // 描述全局配置
└─hvigor // 构建环境配置├─entry
│ ├─libs/arm64-v8a
│ │ ├─libplugins_imageformats_qjpeg.so
│ │ └─libplugins_platforms_qopenharmony.so // Qt安装目录'plugins\platforms'HarmonyOS平台插件so
│ └─src
│ ├─main
│ │ ├─cpp
│ │ │ ├─img // 图片文件夹
│ │ │ │ ├─login.png // 登录显示图片
│ │ │ │ └─user.png // 登录头像图片
│ │ │ ├─clickableuserwidget.cpp // 点击用户头像cpp文件
│ │ │ ├─clickableuserwidget.h // 点击用户头像头文件
│ │ │ ├─CMakeLists.txt // Qt项目CMakeList文件
│ │ │ ├─image.qrc // Qt资源文件
│ │ │ ├─logindialog.cpp // 登录弹窗cpp文件
│ │ │ ├─logindialog.h // 登录弹窗头文件
│ │ │ ├─main.cpp // Qt的主入口
│ │ │ ├─mainwindow.cpp // 主窗口cpp文件
│ │ │ └─mainwindow.h // 主窗口头文件
│ │ ├─ets
│ │ │ ├─abilitystage
│ │ │ │ └─MyAbilityStage.ets
│ │ │ ├─entryability
│ │ │ │ └─EntryAbility.ets // 应用入口
│ │ │ └─pages
│ │ │ └─Index.ets // 主页面实现
│ │ ├─resources // 应用资源目录
│ │ └─module.json5 // 模块级核心配置文件
│ ├─build-profile.json5 // 工程结构/构建/定制化配置信息
│ └─oh-package.json5 // 描述全局配置
└─hvigor // 构建环境配置QDialog
QPixmap
exec
QSystemTrayIcon
QAction
setQuitOnLastWindowClosed
我要提问题