工作中遇到的一些小问题,总结的小知识记录:C++/Qt
小知识4
- mysql导入*.sql文件提示连接超时等问题
- mysql局域网内访问
- VLC低版本的匹配
- QLineEdit的正则表达式限制
- 获取windows下已加载磁盘盘符
- QLabel自动换行
- QElapsedTimer间隔计时
- 自定义Class作为Key需要重载的函数
- QWebEngineView嵌入的网页支持下载文件到本地
mysql导入*.sql文件提示连接超时等问题
cmd使用root用户进入mysql执行:
set global max_allowed_packet = 2*1024*1024*100;
set interactive_timeout=24*3600;
改变语句支持的大小限制,和超时限制
mysql局域网内访问
grant all privileges on . to root@’%’ identified by"root";
设置局域网内所有ip都可以访问本机。
VLC低版本的匹配
更高版本因为已经支持C++11及其以上,所以选择尽量高的版本都可以支持。
- cmake配置:
参考博文:https://blog.csdn.net/wj2itp08/article/details/78391261
把vlc的sdk内容做了一些拷贝工作,到Qt下
*注意:VLC的环境变量其实不用设置。
按参考操作后,自己的cmake配置:
2. 编译成功,Install生成拷贝到CMAKE_INSTALL_PREFIX下。
3. Install时遇到如下几个库未找到的情况,在系统库里找或者拷贝正确的到qt的bin目录下(不是特别重要,主要是保证完整的运行环境)
4. Install后,建议把vlc-x.x.x下的Plugins路径拷贝到生成路径下覆盖一次(删除原来的后覆盖)。虽然在最开始已经拷贝的Qt的路径下了,但为了保险,还是从原始处拷贝覆盖一份。
QLineEdit的正则表达式限制
只能输入英文大小写字母和英文逗号:^[a-zA-Z0-9,]+$
只能输入数字和逗号:^[0-9,]+$
只能输入数字带小数和逗号:^[0-9.,]+$
Qt的调用方式:
QRegExp regx("^[0-9,]+$");
QValidator *validator = new QRegExpValidator(regx, ui->lineEdit);
ui->lineEdit->setValidator(validator);
获取windows下已加载磁盘盘符
#ifdef WIN32
#include <Windows.h>
#endif
std::vector<std::string> GetWindowsDriverName()
{
std::vector<std::string> vecDriver;
#ifdef WIN32
char rootPath[10] = { 0 }, driveType[21] = { 0 };
unsigned int nType;
for (char a = 'A'; a <= 'Z'; a++)
{
sprintf_s(rootPath, "%c:\\", a);
nType = GetDriveTypeA(rootPath);
if (nType != DRIVE_NO_ROOT_DIR) // DRIVE_NO_ROOT_DIR: 路径无效
{
vecDriver.push_back(rootPath);
}
}
#endif
return vecDriver;
}
QLabel自动换行
ui->label_name->setWordWrap(true);
QElapsedTimer间隔计时
QElapsedTimer使用运行平台所支持的某种单调参考时钟,支持类型:
enum ClockType
{ SystemTime, MonotonicClock, TickCounter, MachAbsoluteTime, PerformanceCounter }
//简单使用示例
QElapsedTimer elapsed;
elapsed.start();
std::vector<qint64> vec;
int i = 1000000;
while (i >= 0)
{
i--;
if (i % 10000 == 0)
{
vec.push_back(elapsed.nsecsElapsed());
}
}
qint64 over_ms = elapsed.elapsed();
for (int i =0; i < vec.size(); i++)
{
std::cout << "ns:" << elapsed.nsecsElapsed() << std::endl;
}
std::cout << "ms:" << over_ms << std::endl;
输出:
自定义Class作为Key需要重载的函数
比如在std::map中或者std::set中,需要自定义的类作为索引的key,需要重载几个需要的operator才能满足template模板类的使用。
eg:
class CDevKey
{
public:
CDevKey(const QString& dydevid, const QString referprog);
CDevKey();
bool operator==(const CDevKey& rhs) const;
bool operator!=(const CDevKey& rhs) const;
bool operator<(const CDevKey& rhs) const;
~CDevKey();
QString ToString() const;
bool IsValid() const;
public:
QString m_strDyDevid;
QString m_strReferprog;
};
QWebEngineView嵌入的网页支持下载文件到本地
嵌入Web网页,如果网页内有下载文件到本地的触发请求,或者跳转网页后,触发下载请求的,QWebEngineProfile可以满足需求。
(注意:有两种方式,一种是网页内直接触发,一种是跳转到新的网页触发)
方法:使用QWebEngineProfile获取Request的触发,获取QWebEngineDownloadItem的下载进度和状态。
- QWebEngineView获取QWebEngineProfile方式(关系):
从View中获取Page,在获取Profile。
void CWebTransformerView::InitDownloadHandler(QWebEngineView* pView)
{
if (NULL == pView)
{
return;
}
QWebEnginePage* pPage = pView->page();
if (NULL == pPage)
{
return;
}
QWebEngineProfile* pProfile = pPage->profile();
if (NULL == pProfile)
{
return;
}
connect(pProfile, &QWebEngineProfile::downloadRequested, this, &CWebTransformerView::SlotWebDownloadRequested);
}
当前网页支持下载,其实就是在构造函数调用InitDownloadHandler(也是为后面的跳转新网页下载做复用提取出的公用函数):
CWebTransformerView::CWebTransformerView(QWidget *parent)
: QWebEngineView(parent)
, m_pCurrentSubView(NULL)
, m_pDownloadDialog(NULL)
, m_pCurDownload(NULL)
{
InitDownloadHandler(this); //当前网页也支持下载
}
- QWebEngineProfile的Request信号与槽
connect(pProfile, &QWebEngineProfile::downloadRequested, this, &CWebTransformerView::SlotWebDownloadRequested);
即view内网页触发了下载请求,则会发送downloadRequested信号,触发到我们的槽内,得到一个QWebEngineDownloadItem的对象,即对应一个下载项。
void CWebTransformerView::SlotWebDownloadRequested(QWebEngineDownloadItem *download)
{
if (NULL == download)
{
return;
}
//download下载状态信号
connect(download, &QWebEngineDownloadItem::finished, this, &CWebTransformerView::SlotWebDownloadFinished);
connect(download, &QWebEngineDownloadItem::downloadProgress, this, &CWebTransformerView::SlotWebDownloadProgress);
connect(download, &QWebEngineDownloadItem::stateChanged, this, &CWebTransformerView::SlotWebDownloadState);
download->accept();
//本地记录
m_pCurDownload = download;
//下载进度对话框初始化
if (NULL == m_pDownloadDialog)
{
m_pDownloadDialog = new QProgressDialog(this);
m_pDownloadDialog->setWindowTitle(ConvertCharArrayToQString("模型下载"));
m_pDownloadDialog->setAutoClose(false);
connect(m_pDownloadDialog, &QProgressDialog::canceled, this, &CWebTransformerView::SlotProgressCancel);
}
QString strPath = download->path();
QFileInfo info(strPath);
m_pDownloadDialog->setLabelText(ConvertCharArrayToQString("下载模型到本地:") + info.fileName());
m_pDownloadDialog->setRange(0, 100);
m_pDownloadDialog->show();
}
- QWebEngineDownloadItem的download信号与槽
download的item对应的几个下载相关信号:下载状态、进度、结束。
connect(download, &QWebEngineDownloadItem::finished, this, &CWebTransformerView::SlotWebDownloadFinished);
connect(download, &QWebEngineDownloadItem::downloadProgress, this, &CWebTransformerView::SlotWebDownloadProgress);
connect(download, &QWebEngineDownloadItem::stateChanged, this, &CWebTransformerView::SlotWebDownloadState);
- 关于跳转页面的下载Request获取
方法是获取这个跳转的新页面的QWebEngineView,该View对象调用最开始的InitDownloadHandler后,即它的Profile连接同样的SlotWebDownloadRequested槽,后面的下载操作就复用了。
createWindow内的实现,就是把触发的页面跳转信号捕捉出来,创建一个新的view去接收,同时它的Profile连接Request操作。
// ===== Override
QWebEngineView * CWebTransformerView::createWindow(QWebEnginePage::WebWindowType type)
{
QWebEngineView *webbrowser = new QWebEngineView(this);
InitDownloadHandler(webbrowser);
m_pCurrentSubView = webbrowser;
return webbrowser;
}