用VS 写QT ,设置exe图标的方法:
选定工程--》右键--》添加---》资源--》
QString 字符串用法总结说明
Qt QString 增、删、改、查、格式化等常用方法总结_qstring 格式化-CSDN博客
总结来说:
QString 的 remove有两种用法,:
1:删除自某个索引开始的n个长度的字符串,
2:删除字串中所有的相关字符(是否需要注意大小写),如:
QString str = "0a1A2aa3456789";
-
str.remove(2, 4); // 得到新串: str:"016789
-
str.remove(QChar('a'),Qt::CaseInsensitive);
===> 0123456789
QPushButton->setMouseTracking(true);
SetMouseTracking的作作就是当鼠标悬停在按钮上方,按钮就可以响应鼠标的悬停事件,
如mouse hover之类的功能
QButtonGroup用法示例:
Qt 中QButtonGroup 的用法_qbuttongroup用法-CSDN博客
关于基础代码编程中,
QMainWindow必须要有一个中心窗口部件,而QDialog 却不需要,
也因此做纯代码编程,QMainWindow必须要添加一个QWidget作为中心部件,才行能正常显示
QWidget* globaWidget = new QWidget(this);
this->setCentralWidget(globaWidget);
QVBoxLayout* glayout = new QVBoxLayout;
globaWidget->setLayout(glayout);
QLabel* lb = new QLabel("Hello.....this is labe");
glayout->addWidget(lb);
glayout->addStretch();
QByteArray用法:
QByteArray使用_Alenfun的博客-CSDN博客
QGridlayout setColumnStretch,设置Stretch,
inputLayout->setColumnStretch(1, 1);
inputLayout->setColumnStretch(2, 1);
其作用 就是当遇到伸缩时,第 2,3列按1:1 同比例缩放
QT定时器用法,跟MFC 差不多:
1:启动定时器,startTimer (1000) ,继承于QObject类都有这个函数
2:重载void timerEvent(QTimerEvent *event)
Q_DECLARE_METATYPE关键字用法:
通过Q_DECLARE_METATYPE声明后,就可以让自定义的类型设置到QVariant。
hLay3->addStretch();,布局layout 调用addStrech的作用即是占据布局内,没有摆到控件位置,"空白处",这样一来
将使页面不会因为控件没有摆满而显得凌乱
QT中对话框通过QDialog 来启动实现:
if(!m_pTraceEidtDlg)
{
m_pTraceEidtDlg = new PositionEdit(this);
m_pTraceEidtDlg->setModal(false); //设置是否为模态对话框启动
}
m_pTraceEidtDlg->show();
static QPoint point(m_pTraceEidtDlg->x(),m_pTraceEidtDlg->y());
m_pTraceEidtDlg->move(point);
qt forever,等同于 for(;;)
QT 多线程及防止死锁:
https://download.csdn.net/download/birenxiaofeigg/11963711
Qt movethread用法:
https://www.cnblogs.com/nanqiang/p/10818609.html
Movethread用法:
1.从QObject派生一个类,将耗时的工作写在该类的槽函数中。
2.将派生类对象移动到一个QThread中,该线程需要start。(这一步使用moveToThread)
3.通过信号连接派生类的槽函数,并通过信号触发槽函数。(槽函数在子线程中执行)
QT 也有自己的自动锁:
void CalculusThread::setDeploys(const AssumptionScene& deplays)
{
QMutexLocker lockData( &m_mutex); //加锁,函数执行完后自动解锁
m_deplays = deplays;
}
1:弹出消息库:
QMessageBox
QT 最新下载客户端
Index of /development_releases/qtcreator/5.0/5.0.0-rc1
https://download.qt.io/development_releases/qt/6.2/6.2.0-rc2/single/qt-everywhere-src-6.2.0-rc2.zip
memset(),用来清空数组,由于不同的平台, 数据类型长度不一样,因此,正确的做法是
int dstbuffer[8];
memset(dstbuffer,0,sizeof(int)*8) ;//如果直接用memset(dstbuffer,0,8),是不对的
类应该都要加上拷贝构造函数: CTestA::CTestA(const CTestA& cat) { *this = cat; } 如此一来,便可以使用std::weak_ptr 来承接对象了: CTestA* aJoke = new CTestA(); aJoke->kName = "Hello williamszeee"; aJoke->setMat("Fully oem ding"); std::shared_ptr<CTestA> pTest = std::make_shared<CTestA>(*aJoke); std::weak_ptr<CTestA> mtest = pTest; fsPtr.reset(); //std::shared_ptr<int> fsptr<new int(5)>; if (fwPtr.expired()) //std::weak_ptr<int> fwptr=fsptr; //weak_ptr 自shared_ptr 赋值得来 { std::cout << "shared_ptr object has been destory" << std::endl; } shared_ptr<A> sp(new A()); weak_ptr<A> wp(sp); sp.reset(); // 此时sp被销毁 shared_ptr 主动销毁 通过 reset 函数 cout << wp.expired() << endl; // true表示已被销毁,否则为false
库的模式版本应该与工程的版本一致,如若不然,可能发生意想不到的异常,
比如Relaese模式下调用debug,或是Debug模式下调用release等,
如果是int,bool,double这种基础类型就不会出错,但涉及到字符串就会报异常,
就算用__stdcall也不能幸免。
std::string& trim(std::string &s)
{
if (!s.empty())
{
s.erase(0,s.find_first_not_of(" "));
s.erase(s.find_last_not_of(" ") + 1);
}
return s;
}
using namespace std;
std::string& trim(std::string &s)
{
if (!s.empty())
{
s.erase(0, s.find_first_not_of(" "));
s.erase(s.find_last_not_of(" ") + 1);
s.erase(s.find_last_not_of("\n") + 1);
s.erase(s.find_last_not_of("\r") + 1);
}
return s;
}
去除所有空格:
void trim(string &s)
{
int index = 0;
if(!s.empty())
{
while( (index = s.find(' ',index)) != string::npos)
{
s.erase(index,1);
}
}
}
C++string中find_first_not_of()函数和find_last_not_of()函数
在学习这两个函数之前建议先学C++string中find_first_of()函数和find_last_of()函数。
1、find_first_not_of()函数
正向查找在原字符串中第一个与指定字符串(或字符)中的任一字符都不匹配的字符,返回它的位置。若查找失败,则返回npos。(npos定义为保证大于任何有效下标的值。)
string str="abcdefab";
coutcout
2、find_last_not_of()函数
正向查找在原字符串中最后一个与指定字符串(或字符)中的任一字符都不匹配的字符,返回它的位置。若查找失败,则返回npos。(npos定义为保证大于任何有效下标的值。)
string str="abcdefab";
coutcout
WaitForSingleObject(m_hStateEvent, INFINITE);
std::cout
如果m_hStateEvent为空,也就是0值 时,会继续往下执行,否则会无限等待,
直到m_hStateEvent信号被激活为止
实践证明:struct 是可以在动态库中直接导出的,就像基础数据类型:int,double等数据类型那样
如何仿止线程里的无限循环发生死锁?
最好的办法是采用信号量的方式,通过连环发送信号,(初始时置信号状态为true,即为激活状态),即对于wiat_single
WaitForSingleObject(m_hStateEvent, INFINITE);
不用主动setEvent去激活,而是直接调用执行
//HANDLE m_hStateEvent;
if (m_hStateEvent == NULL)
{
m_hStateEvent = ::CreateEvent(0, false, true, 0);//初使状态便置至为true
}
C++ 基础入门:C++入门教程,C++基础教程(更新完毕)
关于动态库C++ 方式封装,
正业项目光管库作了一次重大改进,这也是来此之后的一次技术进步与收获,
动态库可以进一步封装为class类的方式:
#pragma once
#include "qxraycanutube_global.h"
#include
#include
#include
using XrayFun = std::function;
class QXRAYCANUTUBE_EXPORT QXrayCanuTube
{
public:
QXrayCanuTube() = delete;
explicit QXrayCanuTube(int comport);
void setXrayObserver(XrayFun mfun);
bool XOn();
bool XOff();
bool CheckConnect();
void SetVoltage(int kv);
void SetCurrent(int cu);
void scanPortList(std::vector& portList);
bool xTubeConnect();
void xTubeDisconnect();
private:
int _serialPort;
void* pts;
};
QXRAYCANUTUBE_EXPORT 就是一个dll import ,dll export的声明,为不至于忘记C 风格的封装,从源头上理解动态加的
封装(编译器vs2017 在安装QT VSTool 之后,新建QT库工程时,会自动生成这些关键字,而VC++本项的项目却要手动添加系列关键字),故而需要继续保留,
谈谈Debug库版本的用法注意事项:
C++ 中的库有静态和动态,同时分debug和Release版本,一般静态库只能用于Release版本,不能用于Debug模式,
也就是常说的库环境冲突,而动态库则没有这个限制,通常是以Release模式发行,但在debug和Release模式下都可
被调用,这也是相比起静态库有独到优势。
1:今天发现项目工程用的是C++14.0标准,而一些代码需要用到C++17.0或是C++20.0,那样更加简洁,效率更高,
如果将源码直接集成到项目中,则会出问题 ,导致项目出现各种各样的冲突,此时解决的最好办法是将这些新代码集成到一个库中
,而这个独立库则可以用最新C++标准去做,如此一来,动态库,或是静态库都可以,
当然最佳解决之法还是隐式def方式导出动态库方式!!!
或者这才是VC++ 的最大魅力这所在!
2: 引入windgi.h头文件之后 会报一堆异常,处理方法是添加一个宏:
AMD64
然后再引用 即:
#include
#include
3:关于websocketpp 的使用,需要Asio(1.2)库,boost(1.7.4+)库的配合
4: $(ProjectDir)\..\include VS 当前项目下的路径:
5:关于continue的真正用意,便是跳过当前条件,直接再次开始 循环,
std::cout
for (int i = 0; i < 100; i++)
{
if (i % 2 != 0)
{
continue; //如果不是偶数,就直接返回,从下一个i值进行,如此一来奇数便不会打印屏幕上了
}
std::cout
Sleep(1000);
}