# QT疑难问题 **Repository Path**: wenjinzhu/qt-problems ## Basic Information - **Project Name**: QT疑难问题 - **Description**: QT项目中遇到的一些问题处理经验 - **Primary Language**: C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2020-10-18 - **Last Updated**: 2021-12-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # QT疑难问题 #### 介绍 QT项目中遇到的一些问题处理经验 ### 一、QWebEngineView相关 1. qt5.12版本中的QWebEngineView对于Cocos Creator开发的网页游戏支持不好,会出现闪屏或者加载失败的情况。可以改用qt5.14版本(更新到更新为基于Chromium 77) 2. 当加载的网页或游戏需要自动播放音效时,需要设置QWebEngineSettings::PlaybackRequiresUserGesture为false 3. 忽略SSL证书错误,可以继承QWebEnginePage,重写certificateError方法,并通过setPage设置给相应的QWebEngineView 4. 通过设置QWebEngineSettings::LocalContentCanAccessRemoteUrls,可以解决跨域问题 5. 通过设置setContextMenuPolicy(Qt::NoContextMenu),可以禁掉QWebEngineView右键菜单 6. 有时候使用QNetworkAccessManager进行文件下载时,会出现下载的文件不完整或者0kb的情况,可以通过QWebEnginePage的download方法进行下载。下载进度可以通过QWebEngineDownloadItem::downloadProgress获取到 ``` QWebEnginePage *page = new QWebEnginePage(this); QWebEngineProfile *profile = page->profile(); connect(profile, &QWebEngineProfile::downloadRequested, [=](QWebEngineDownloadItem *item) { connect(item, &QWebEngineDownloadItem::finished, [=]() { // 启动安装 CommonToast::showTip(QStringLiteral("下载完成,准备安装"), 1500, this); QTimer::singleShot(1500, [=]() { // 生成安装脚本 QString batPath = createInstallScript(targetPath); // 启动安装脚本 QProcess::startDetached("cmd", QStringList() << "/c" << batPath); }); }); connect(item, &QWebEngineDownloadItem::downloadProgress, [=](qint64 bytesReceived, qint64 bytesTotal) { // 更新进度条 int progress = bytesReceived * 100.0f / bytesTotal; ui.updateProgressBar->setValue(progress); }); //确认此次下载 item->accept(); }); page->download(QUrl(m_updateMap["downloadUrl"].toString()), targetPath); ``` 7. 通过设置QWebEngineView不使用代理QNetworkProxyFactory::setUseSystemConfiguration(false);可以加快网页的加载速度 ### 二、控件相关 1. QPushButton同时监听大键盘和小键盘的enter键,通过ui.pushButton->setShortcut(Qt::Key_Enter|Qt::Key_Return)是不能同时生效的。可通过实现窗口的keyPressEvent方法,在内部处理这两个按键的事件 ``` void QWidget::keyPressEvent(QKeyEvent* event) { if (event->key() == Qt::Key_Enter || event->key() == Qt::Key_Return) { // 按键处理事件 } QWidget::keyPressEvent(event); } ``` 2. 有时调用一个QWidget的close()会出现资源没有被释放的问题,导致内存占用没有降低,可通过setAttribute(Qt::WA_DeleteOnClose);设置该属性让窗口关闭时释放相关资源 3. 有时希望某个控件隐藏不见但是保留位置占用,类似于android的setVisibility()里边的INVISIBILITY属性,可以这么处理 ``` QSizePolicy policy = widget->sizePolicy(); policy.setRetainSizeWhenHidden(true); widget->setSizePolicy(policy); ``` 4. 有时通过下方qss设置QComboBox下拉选择项的高度不起效,这是我们需要在代码中调用一下QComboBox->setView(new QListView()); ``` QComboBox QAbstractItemView::item { height: 40px; } ``` 5. 在使用QComboBox的信号currentTextChanged时,需要注意的是,当你调用QComboBox.clear()方法时,一样会触发该信号,这时获取到的选项就是空字符串 6. 使用QNetworkAccessManager 进行post请求, 如果在请求期间网络断开,网络恢复后,依然会提示请求失败,返回UnknownNetworkError。这时可以使用setNetworkAccessible()设置一下即可 ``` if (m_manager->networkAccessible() == QNetworkAccessManager::NotAccessible) { m_manager->setNetworkAccessible(QNetworkAccessManager::Accessible); } ``` 7. QTableView/QTableWidget可通过设置setSectionResizeMode(QHeaderView::Stretch),让列宽等分并充满整个视图的宽度,通过resizeRowsToContents()可以让行高根据内容自动调整高度 8. QWidget可通过inherits(const char *className)函数,判断是否属于该className类或className子类的实例 9. QWidget可通过setProperty函数保存必要信息,需要使用时再通过property()函数拿出来使用