QT学习笔记

2018.11.30

VS2015和QT5.7.1解决中文乱码问题

头文件中加入

#if _MSC_VER >= 1600  
#pragma execution_character_set("utf-8")  
#endif

2018.12.01

QT保存中文字符有乱码

QString str4=u8"中文字符";    //好像这种方法只适合C++11以上版本

管用

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK"));
//这个函数已经没有了

2018.12.04

在cpp中无法调用在Qt设计界面添加的控件
  1. 在vs解决方案里面选中ui界面,然后右键选择“编译”;
  2. 在vs解决方案里面选中项目,然后右键选择“重新扫描解决方案”
  3. 在cpp中就可以通过ui->(或者ui.)获得添加的控件的名称
控件和槽函数已经连接好了,但点按钮没有反应
忘记加在private slots:里了
点击.ui文件出现两个Qt designer窗口
  1. 右击ui选择打开方式
  2. 添加F:\Software\QT\5.7\msvc2015_64\bin\designer.exe,重命名为qt designer plus
  3. 将qt designer plus设置为默认打开方式
未定义标识符

https://blog.csdn.net/u013569304/article/details/60133149

qt-vs添加图片资源

https://blog.csdn.net/u011520129/article/details/55001970

2018.12.05

error LNK2019

https://blog.csdn.net/a553455/article/details/82423870

设置程序图标
	QApplication a(argc, argv);
	a.setWindowIcon(QIcon("./pic/logo.ico"));
	ProgressDlg w;
	w.show();
	return a.exec();

2018.12.10

不允许使用不完整的类型

QLineEdit没有引入对应的头文件

slot的区别
  • public slots:在这个区内声明的槽意味着任何对象都可将信号与之相连接。这对于组件编程非常有用,你可以创建彼此互不了解的对象,将它们的信号与槽进行连接以便信息能够正确的传递。
  • protected slots:在这个区内声明的槽意味着当前类及其子类可以将信号与之相连接。这适用于那些槽,它们是类实现的一部分,但是其界面接口却面向外部。
  • private slots:在这个区内声明的槽意味着只有类自己可以将信号与之相连接。这适用于联系非常紧密的类。

2018.12.14

ntdll.dll出问题后面又好了,ImageProcessor
Qt5PrintSupportd.lib
qtmain.lib
Qt5Guid.lib
Qt5Widgetsd.lib
Qt5Cored.lib

全部加上d,qmaind.lib不行的话就用qmain.lib我也不知道为什么,反正我两个一同的文件夹,能分别引用这两种不同的库,等学得深一点了再来看看吧

2018.12.17

显示一片空白

Layout后面不加frame或者this就会出现这种情况

2018.12.22

stream << "Profile," << "ProfileCnt," << "ProfDataCnt," << "Envelope," << "EncoderCnt," << "TriggerCnt,";
for (int k = 0; k < nReceiveDataSize - 1; k++)
		{
			stream << ds + dp*k << ",";
		}

2018.12.28

C/C++附加包含目录

F:\Software\QT\5.7\msvc2015_64\include
F:\Software\QT\5.7\msvc2015_64\include\QtOpenGL
F:\Software\QT\5.7\msvc2015_64\include\QtWidgets
F:\Software\QT\5.7\msvc2015_64\include\QtGui
F:\Software\QT\5.7\msvc2015_64\include\QtANGLE
F:\Software\QT\5.7\msvc2015_64\include\QtCore

链接库目录

C:\utils\postgresql\pgsql\lib
C:\utils\my_sql\my_sql\lib
C:\utils\postgresql\pgsql\lib

附加依赖项

qtmaind.lib
Qt5Cored.lib
Qt5Widgetsd.lib
Qt5OpenGLd.lib
Qt5Guid.lib
qwtplot3d.lib

2018.12.30

  1. clicked是用户在界面上操作时导致的触发动作,例如鼠标点击、快捷键操作等,而编程方式不会触发它。toggled是在状态切换时触发的,不管编程的切换还是用户操作的切换。

2019.02.27

  1. 在Qt里按钮控件默认对应一个on_pushButton_clicked()成员,如果想用点击信号,在代码中实现on_pushButton_clicked()成员即可
新建一个QDialog报错的一些原因
  • 开始没有加入CameraControl文件里没有#include “ui_CameraControl.h”,所以出现Ui里没有我定义的Class
  • 后面点击弹出QDialog时出现访问冲突,因为在定义ui时抄的例程上的*ui变成了指针,所以报错

2019.12.13

追加写入文件
QFile *file = new QFile(QDir::currentPath()+"/"+"user1");//此路径下没有就会自己创建一个
while(!file->open(QIODevice::ReadWrite | QIODevice::Append));//以读写切追加写入的方式操作文本

多组RadionButton分别实现互斥
QButtonGroup * m_bgS = new QButtonGroup(this);
m_bgS->addButton(ui.SPosRadio);
m_bgS->addButton(ui.SVelRadio);
m_bgS->setExclusive(true);
删除QVector中的某个值
int k;
QVector<QString>::iterator iter;
for (k=0,iter = Member.begin(); iter != Member.end(); iter++,k++)
{
	if (k == Idx)
	{
		Member.erase(iter);
		break;
	}
}
QLCDNumber显示时间

定义变量

QLCDNumber * clock;
QTime * time;
QTimer * timer;
private slots:
	void showTime();

初始化

timer = new QTimer(this);
timer->setInterval(1);
time = new QTime();
QString text = time->toString("hh:mm");
connect(timer, SIGNAL(timeout()), this, SLOT(showTime()));
clock = new QLCDNumber(this);
clock->setDigitCount(8);     
clock->setPalette(Qt::darkBlue);
clock->move(30, 30);
timer->start();

showTime

void Castle::showTime()
{
	QString text = time->currentTime().toString("hh:mm:ss");
	clock->display(text);
}

2019.12.14

设置QHBoxLayout

QMainWindow里Layout不能直接生效,要使用一个QWidget当过渡

	QLineEdit * LineEdit = new QLineEdit("编辑框",this);
	QTextEdit * TextEdit = new QTextEdit(this);
	QHBoxLayout * Layout = new QHBoxLayout(this);
	Layout->addWidget(LineEdit);
	Layout->addWidget(TextEdit);
	QWidget* main_widget = new QWidget(this);
	main_widget->setLayout(Layout);
	this->setCentralWidget(main_widget);
QGridLayout
	QGridLayout * layout = new QGridLayout(this);
	QComboBox * fontComboBox = new QComboBox(this);
	QPushButton * btn = new QPushButton(this);
	QTextEdit * textEdit = new QTextEdit(this);
	layout->addWidget(fontComboBox, 0, 0, 1, 2); //可以设置在栅格中位置和占的行数和列数
	layout->addWidget(btn, 0, 2, 1, 1);
	layout->addWidget(textEdit, 1, 0, 1, 3);
	QWidget * main_widget = new QWidget(this);
	main_widget->setLayout(layout);
	this->setCentralWidget(main_widget);
通过PushButton显示和隐藏部件
btn = new QPushButton(this);
btn->setCheckable(true);
connect(btn, SIGNAL(toggled(bool)), this, SLOT(on_btn_toggled(bool)));

隐藏部件的槽函数

void Castle::on_btn_toggled(bool checked)
{
	if (checked)
	{
		btn->setText(tr("显示可扩展窗口"));
		textEdit->hide();
	}
	else
	{
		btn->setText(tr("隐藏可扩展窗口"));
		textEdit->show();
	}
}
伙伴系统实现Alt+快捷键
	QPushButton * btn = new QPushButton("Button",this);
	QLabel * label_btn = new QLabel("&Button",this);
	QCheckBox * CheckBox = new QCheckBox(this);
	QLabel * label_Check = new QLabel("&CheckBox", this);
	label_Check->setBuddy(CheckBox);
	label_btn->setBuddy(btn);
	QGridLayout * layout = new QGridLayout(this);
	layout->addWidget(label_btn, 0, 0, 1, 1);
	layout->addWidget(btn, 0, 1, 1, 1);
	layout->addWidget(label_Check, 1, 0, 1, 1);
	layout->addWidget(CheckBox, 1, 1, 1, 1);
	QWidget * main_widget = new QWidget(this);
	main_widget->setLayout(layout);
	this->setCentralWidget(main_widget);
QT删除整个文件夹
QString del_file = QString("./data/2019-03-23");
QDir dir;
dir.setPath(del_file);
dir.removeRecursively()
QFile和文件重新关联
fr.setFileName(filename); //QFile和文件重新关联
in.setIODevice(fr); //QTextStream和QFile重新关联
卡尔曼滤波
static int count = 0;
	static QList<QPointF> data;
	static QList<QPointF> data_pred;
	static VectorXd xprev = VectorXd::Zero(m_kalmanFilter->get_state_size());
	static VectorXd y_meas = VectorXd::Zero(m_kalmanFilter->get_meas_size());
	series_pred.setColor(QColor(255, 0, 0));

	if (count < m_DataVectorX.size())
	{
		if (count == 0)
		{
			fp.setFileName("data/traj_pred.txt");
			fp.open(QIODevice::ReadWrite | QIODevice::Text);
			out.setDevice(&fp);
			xprev << m_DataVectorX[0], 0, m_DataVectorY[0], 0;
		}
		m_kalmanFilter->Predict(xprev);
		y_meas << m_DataVectorX[count], m_DataVectorY[count];
		xprev = m_kalmanFilter->Update(y_meas);
		data_pred.append(QPointF(xprev[0], xprev[2]));
		out << QString::number(xprev[0]) << "," << QString::number(xprev[2]) << "\r\n";
		series_pred.replace(data_pred);
		count++;
	}
添加文件夹
	int fontId = QFontDatabase::addApplicationFont("./Resources/方正舒体简体.ttf");
	qDebug() << "fontId = " << fontId;
	QString msyh = QFontDatabase::applicationFontFamilies(fontId).at(0);
	qDebug() << "msyh = " << msyh;

2020.01.08

获取主机信息
QString localHostName = QHostInfo::localHostName();
QHostInfo hostInfo = QHostInfo::fromName(localHostName);
QList<QHostAddress> listAddress = hostInfo.addresses();
if(!listAddress.isEmpty())
{
	for (int k = 0; k < listAddress.size(); k++)
			qDebug() << k << " " << listAddress.at(k);
}
获取网络接口相关信息
QString detail = "";
QList<QNetworkInterface> list = QNetworkInterface::allInterfaces();
for (int k = 0; k < list.count(); k++)
{
	QNetworkInterface interface = list.at(k);
	detail += tr("设备: ") + interface.name() + "\n";
	detail += tr("硬件地址:") + interface.hardwareAddress() + "\n";
	QList<QNetworkAddressEntry> entryList = interface.addressEntries();
	for (int j = 1; j < entryList.count(); j++)
	{
		QNetworkAddressEntry entry = entryList.at(j);
		detail += "\t" + tr("IP地址: ") + entry.ip().toString() + "\n";
		detail += "\t" + tr("子网掩码: ") + entry.netmask().toString() + "\n";
		detail += "\t" + tr("广播地址: ") + entry.broadcast().toString() + "\n";
	}
}
QMessageBox::information(this, tr("detail"), detail);
QTcpSocket通信实现过程中遇到的问题
  • 客户端连不上服务器端,这是因为服务器端采用获取新用户的方法是,重写QTcpServer中的incomingConnection(qintptr socketDescriptor)函数,但是重写的时候把qintptr改成了int,所以incomingConnection的某些功能就没有实现
  • 客户端发送文字,服务器端接收的中文字符是正常,客户端接收的字符却是乱码,这是因为客户端的readyRead槽函数并不是由客户端写入的数据触发的,客户端写入的数据触发服务器端TcpSocket的readyRead函数,服务器再把接收到信息返回给客户端。客户发送时使用代码是
tcpSocket->write(msg.toUtf8().data());

客户端接收的代码是

while (tcpSocket->bytesAvailable()>0)
{
	QByteArray datagram;
	datagram.resize(tcpSocket->bytesAvailable());
	tcpSocket->read(datagram.data(), datagram.size());
}

服务器端写的时候用的却是toLatin1,所以产生了乱码,客户端写入数据是不会触发自己的readyRead函数的。

statusBar()用法
statusBar()->addPermanentWidget(widget); //添加永久信息,在控件的最后一个后面添加
statusBar()->insertPermanentWidget(2,widget) //指定控件添加的位置
statusBar()->showMessage("show message",3000) //显示临时信息

2020.01.15

QtCharts的一个注意点

QChart使用 createDefaultAxes()函数后,就会生成默认为0~1的坐标系,将前面做的Axis设置全都作废

QtChart绘制动态曲线
static QList<QPointF> data;
static int  timeTick = 0;
readTxtData("Resources/data/sine.txt", 2, dataVector);
static int num = 40;
if (data.size()<num)
{
	data.push_back(QPointF((double)(timeTick)*0.1, m_dSensorProp*dataVector[timeTick][1]));
}
else
{
	for (int k = 0; k < num-1; k++)
		data[k].setY(data[k + 1].y());
	data[num-1].setY(m_dSensorProp*dataVector[timeTick][1]);
}
timeTick = (timeTick + 1) % num;
m_Curve2d.m_lineSeries->replace(data);
散点加曲线
readTxtData("Resources/data/rts.txt", 2, dataVector);
	static QList<QPointF> data;
	static QList<QPointF> data_sc;
	static int num = 0;
	if (num < dataVector.size())
	{
		data.push_back(QPointF(dataVector[num][0], dataVector[num][1]));
		data_sc.clear();
		data_sc.push_back(QPointF(dataVector[num][0], dataVector[num][1]));
	}
	else 
	{
		num = 0;
		data.clear();
	}
	m_Curve2d.m_lineSeries->replace(data);
	m_Curve2d.m_scatterSeries->replace(data_sc);
	num++;

2020.01.23

  1. 新建QT项目时出现cannot instantiate QtProjectEngine object错误,解决方法为QT5 ⇒ \Rightarrow Reinstall templates and register libraries
  2. 生成moc文件的路径为
    “$(QTDIR)\bin\moc.exe” “%(FullPath)” -o “.\GeneratedFiles$(ConfigurationName)\moc_%(Filename).cpp”
VS+QT调出命令行的方法

在用VS编译调试qt程序时:
属性—>配置属性—>连接器—>系统—>子系统(在窗口右边)—>下拉框选择Console (/SUBSYSTEM:CONSOLE)
或者在新建QT项目时选择Qt console Application

2020.01.27

图像的变换
QImage image;
QMatrix matrix;
matrix.scale(2,2);//缩放
image = image.transformed(matrix);
image.mirrored(true,true);//选择镜像方向

2020.02.02

qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
qrand();

2020.07.10

QT设置背景透明和没有边框

setAttribute(Qt::WA_TranslucentBackground);
setWindowFlags(Qt::FramelessWindowHint)

2020.10.26

QImage load函数读取图片的时候用\读不出来,用/才能读出来

2021.01.20

C++: 左移,低位补零,右移无符号数高位补0,有符号数高位补1

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值