• C++/Qt 小知识记录4


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

    mysql导入*.sql文件提示连接超时等问题

    cmd使用root用户进入mysql执行:

    set global max_allowed_packet = 2*1024*1024*100;
    set interactive_timeout=24*3600;
    改变语句支持的大小限制,和超时限制
    
    • 1
    • 2
    • 3

    mysql局域网内访问

    grant all privileges on . to root@’%’ identified by"root";
    设置局域网内所有ip都可以访问本机。
    
    • 1
    • 2

    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.,]+$
    
    • 1
    • 2
    • 3

    Qt的调用方式:

    QRegExp regx("^[0-9,]+$");
    QValidator *validator = new QRegExpValidator(regx, ui->lineEdit);
    ui->lineEdit->setValidator(validator);
    
    • 1
    • 2
    • 3

    获取windows下已加载磁盘盘符

    #ifdef WIN32
    #include 
    #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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    QLabel自动换行

    ui->label_name->setWordWrap(true);
    
    • 1

    QElapsedTimer间隔计时

    QElapsedTimer使用运行平台所支持的某种单调参考时钟,支持类型:

    enum ClockType
    { SystemTime, MonotonicClock, TickCounter, MachAbsoluteTime, PerformanceCounter }
    
    • 1
    • 2
    //简单使用示例
    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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    输出:
    在这里插入图片描述

    自定义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;
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    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);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    当前网页支持下载,其实就是在构造函数调用InitDownloadHandler(也是为后面的跳转新网页下载做复用提取出的公用函数):

    CWebTransformerView::CWebTransformerView(QWidget *parent)
    	: QWebEngineView(parent)
    	, m_pCurrentSubView(NULL)
    	, m_pDownloadDialog(NULL)
    	, m_pCurDownload(NULL)
    {
    	InitDownloadHandler(this); //当前网页也支持下载
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    1. QWebEngineProfile的Request信号与槽
    connect(pProfile, &QWebEngineProfile::downloadRequested, this, &CWebTransformerView::SlotWebDownloadRequested);
    
    • 1

    即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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    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
    • 2
    • 3
    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 相关阅读:
    代码随想录算法训练营第五十一天| 309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费
    基于SSH开发高列火车票票务查询订购系统
    vmware安装MacOS以及flutter遇到的问题
    22.1 正则表达式-定义正则表达式、正则语法
    Windows7安装SSH客户端的解决方案
    如何通过上传图片判断参数设置是否正确
    Linux 中设置静态IP的方法步骤
    MySQL索引,你真的学会了?索引底层原理是什么?索引什么时候失效,你知道吗?
    JAVA- Acwing -求 1+2+...+n
    Java面向对象(高级)-- 类中属性赋值的位置及过程
  • 原文地址:https://blog.csdn.net/Being__/article/details/134293555