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设计界面添加的控件
- 在vs解决方案里面选中ui界面,然后右键选择“编译”;
- 在vs解决方案里面选中项目,然后右键选择“重新扫描解决方案”
- 在cpp中就可以通过ui->(或者ui.)获得添加的控件的名称
控件和槽函数已经连接好了,但点按钮没有反应
忘记加在private slots:里了
点击.ui文件出现两个Qt designer窗口
- 右击ui选择打开方式
- 添加F:\Software\QT\5.7\msvc2015_64\bin\designer.exe,重命名为qt designer plus
- 将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
- clicked是用户在界面上操作时导致的触发动作,例如鼠标点击、快捷键操作等,而编程方式不会触发它。toggled是在状态切换时触发的,不管编程的切换还是用户操作的切换。
2019.02.27
- 在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
- 新建QT项目时出现cannot instantiate QtProjectEngine object错误,解决方法为QT5 ⇒ \Rightarrow ⇒Reinstall templates and register libraries
- 生成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