qt QLineEdit文本框只能输入数字 qt测试代码运行时间 qstring是区分大小写 原创

Qt 限制文本框仅输入数字,正则表达式

QRegExp rx("^(\\d|[1-9]\\d|(1[0-2][0-3]))$");//输入范围为【0-123】
QRegExp rx2("^(-[1-9][0-9][0-9]|-[1-9][0-9]|-[1-9])|(500|\\d|[1-9]\\d|[1-4]\\d\\d)$");//输入范围限
制为【-999-500】
QRegExp rx3("^-?((\\d|[1-9]\\d)(\\.\\d{0,2})?)$");//输入范围是【-99.99-99.99】
QRegExpValidator *regval = new QRegExpValidator(rx);
QRegExpValidator *regval2 = new QRegExpValidator(rx2);
QRegExpValidator *regval3= new QRegExpValidator(rx3);//3 个 lineedit 输入限制
QLineEdit *lineEdit=new QLineEdit(this);
lineEdit->setValidator(regval);
lineEdit->setValidator(regval2);
lineEdit->setValidator(regval3);

QLineEdit 只能输入数字和点号

//请输入新尺寸中限制输入:只能输入数字和点号

QRegExp rx("^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$");
EditMicroAdjust->setValidator(new QRegExpValidator(rx));

qstring是区分大小写

QString str1 = "aaa";
QString str2 = "AAA";
// QString 默认状态是区分大小写
// Qt::CaseSensitive 默认状态,区分大小写
// Qt::CaseInsensitive 这个是不区分大小写
qDebug() << str1.compare(str2); // 没填入第二个参数,默认区分大小写
qDebug() << str1.compare(str2, Qt::CaseInsensitive);
if (!str1.compare(str2, Qt::CaseInsensitive))
{
qDebug() << "true";
}
else
{
qDebug() << "false";
}

测试代码运行时间

方法一

QElapsedTimer mstimer;

QElapsedTimer mstimer;
mstimer.start(); 、、、、、你要测试的一段代码
float time=(double)mstimer.nsecsElapsed() / (double)1000000;

方法二

QTime time;

#include <QDebug>
#include <QTime>
#include <sys/time.h>
#include <windows.h>
#include <math.h>
void function(); //测试函数
int main(void)
{
qDebug()<<"-------------------------------";
/*************************************************/
//方法 1 利用 QTime,其精度为 ms 级
QTime time;
time.start();
function();
qDebug()<<time.elapsed()/1000.0<<"s";

//运行结果 0.109s

方法三

利用 gettimeofday(),其精度为 us 级

struct timeval tpstart,tpend;
float timeuse;
gettimeofday(&tpstart,NULL);
function();
gettimeofday(&tpend,NULL);
timeuse=(1000000*(tpend.tv_sec-tpstart.tv_sec) +
tpend.tv_usec-tpstart.tv_usec)/1000000.0;
qDebug()<<timeuse<<"s";

//运行结果:0.109375 s

方法四

利用 clock(),其精度为 ms 级

double time_Start = (double)clock();
function();
double time_End = (double)clock();
qDebug()<<(time_End - time_Start)/1000.0<<"s";

方法五

利用 windows.h(VC)函数,提精度为 us 级

LARGE_INTEGER litmp;
LONGLONG Qpart1,Qpart2,Useingtime;
double dfMinus,dfFreq,dfTime;
//获得 CPU 计时器的时钟频率
QueryPerformanceFrequency(&litmp);//取得高精度运行计数器的频率 f,单位
是每秒多少次(n/s),
dfFreq = (double)litmp.QuadPart;
QueryPerformanceCounter(&litmp);//取得高精度运行计数器的数值
Qpart1 = litmp.QuadPart; //开始计时
function(); //待测试的计算函数等
QueryPerformanceCounter(&litmp);//取得高精度运行计数器的数值
Qpart2 = litmp.QuadPart; //终止计时
dfMinus = (double)(Qpart2 - Qpart1);//计算计数器值
dfTime = dfMinus / dfFreq;//获得对应时间,单位为秒,可以乘 1000000 精确到
微秒级(us)
Useingtime = dfTime*1000000;
qDebug()<<dfTime<<"s";

QComboBox触发

void (QComboBox::*p)(const QString &) = &QComboBox::currentIndexChanged;
connect(comboBox,p,[=]()
{
qDebug()<<"当前值"<< comboBox ->currentText();
});

// 重置窗口大小
resize(600,400);

// 菜单栏 只能最多有一个
//菜单栏创建
QMenuBar * bar = menuBar();
//将菜单栏放入到窗口中
setMenuBar(bar);
//创建菜单
QMenu * fileMenu = bar->addMenu(“文件”);
QMenu * editMenu = bar->addMenu(“编辑”);
//创建菜单项
QAction * newAction = fileMenu->addAction(“新建”);
//添加分割线

fileMenu->addSeparator();
QAction * openAction = fileMenu->addAction(“打开”);
//工具栏 可以有多个
QToolBar * toolBar = new QToolBar(this);
addToolBar(Qt::LeftToolBarArea,toolBar);
//后期设置 只允许 左右停靠
toolBar->setAllowedAreas( Qt::LeftToolBarArea | Qt::RightToolBarArea );
//设置浮动
toolBar->setFloatable(false);
//设置移动 (总开关)
toolBar->setMovable(false);

//工具栏中可以设置内容
toolBar->addAction(newAction);
//添加分割线
toolBar->addSeparator();
toolBar->addAction(openAction);
//工具栏中添加控件
QPushButton * btn = new QPushButton(“aa” , this);
toolBar->addWidget(btn);
//状态栏 最多有一个
QStatusBar * stBar = statusBar();
//设置到窗口中
setStatusBar(stBar);
//放标签控件
QLabel * label = new QLabel(“提示信息”,this);

stBar->addWidget(label);
QLabel * label2 = new QLabel(“右侧提示信息”,this);
stBar->addPermanentWidget(label2);
//铆接部件 (浮动窗口) 可以有多个
QDockWidget * dockWidget = new QDockWidget(“浮动”,this);
addDockWidget(Qt::BottomDockWidgetArea,dockWidget);
//设置后期停靠区域,只允许上下
dockWidget->setAllowedAreas( Qt::TopDockWidgetArea |
Qt::BottomDockWidgetArea );
//设置中心部件 只能一个
QTextEdit * edit = new QTextEdit(this);
setCentralWidget(edit)

#include <string>
#include <iostream>
#include <iosfwd>
#include <sstream>

std::string OneMath::DoubleToStr(const double& value_, const int num)
{
	     std::stringstream stristream;
	     stristream.setf(std::ios::fixed);
	     stristream.precision(num);
	     stristream << value_; //四舍五入
                     double _double = atof(stristream.str().c_str());
	     stristream.clear();

                     std::stringstream s;
                        s.unsetf(std::ios::showpoint); //unsetf换成setf,则会显示小数点后多余的0
                        s << _double;
                        return s.str();
}

C# 通过CLR调用 C++ 的方法和类 Visual Studio 2017

0准备工作
测试平台:Visual Studio 2017
操作系统:window 10
CLR: Common Language Runtime
CLI: Common Language Infrastructure

1:创建c++项目,需要被调用的c++方法【c++源代码 无需修改】

h代码

#pragma once
class __declspec(dllimport) TestCppClass
{
public:
	//测试参数有返回值
	int  TestCal(int value1,int value2);
};`

.cpp代码

#include "TestCppClass.h"

int TestCppClass::TestCal(int value1, int value2)
{
	return value1 + value2;
}

修改配置

进入输出目录可以看到生成的CppTest.dll 文件

2:实现CLR【封装要调用的接口】

设置库目录

添加lib文件

设置配置

生成dll

3:使用C#调用
添加引用

h

#pragma once
#include "../CppTest/TestCppClass.h"

using namespace System;
using namespace System::Collections::Generic;

public ref class TestCLR
{
private:
	TestCppClass* nativeHandle;
public:
	property TestCppClass* Handle
	{
		TestCppClass* get()
		{
			return nativeHandle;
		}
	}
public:
	TestCLR();
	~TestCLR();
	!TestCLR();
	void InstanceCleanup();
public:
	int TestCalClr(int value1,int value2);
};

Cpp

#include "TestCLR.h"

TestCLR::TestCLR()
{
	nativeHandle = new TestCppClass();
}

TestCLR::~TestCLR()
{
	this->!TestCLR();
}

TestCLR::!TestCLR()
{
	InstanceCleanup();
}

void TestCLR::InstanceCleanup()
{
	//以原子操作的形式,将整数设置为指定的值并返回原始值。
	int tempVal = (int)(void*)nativeHandle;
	int temp = System::Threading::Interlocked::Exchange(tempVal, 0);
	if (temp != 0)
	{
		if (nativeHandle)
		{
			delete nativeHandle;
			nativeHandle = 0;
			System::GC::SuppressFinalize(this);
		}
	}
}

int TestCLR::TestCalClr(int value1, int value2)
{
	return nativeHandle->TestCal(value1, value2);
}

4:修改后重新调用
需要删除生成的cs文件再重新生成
5:新增
如果新增c++结构体作为参数进行传递时如何在c#中使用。
6:参考
https://blog.csdn.net/qq_42067550/article/details/123681475
附:交流邮箱:yzxxty39@163.com

posted @ 2024-04-21 08:44  一点灯  阅读(0)  评论(0编辑  收藏  举报  来源