C++/Qt 小知识记录4

工作中遇到的一些小问题,总结的小知识记录:C++/Qt

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及其以上,所以选择尽量高的版本都可以支持。

  1. 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的下载进度和状态。

  1. 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); //当前网页也支持下载
}
  1. 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();
}
  1. 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);
  1. 关于跳转页面的下载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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值