[TOC]
QT学习中遇到的问题
1、运行时提示无法启动进程错误
在左侧项目选项中=》构建项目是红色的=》选择项目的目录=》运行
2、QObject::connect: No such slot . 当信号与槽不能链接
成员函数没有放到public slots里面,信号槽函数必须要放在这里。
3、error: 无法打开文件“d:\Qt\2010.05\qt\lib\qtmaind.lib”
vc的编译器, 而你安装的是mingw版本的qt。
工具-选项-构建和运行-构建套件,你应该是选择的是桌面(默认)。点击它,看看编译器那个框选择的是什么?默认选择的是M..V..C++(86)。编译方式从VS2010改成Mingw,就不会报错了
4、make时出现/usr/bin/ld: skipping incompatible
一个是arm架构的,一个是x86架构的,当然不兼容了
5、Qt & SSL, Handshake failed
使用qwebview直接打开https网页报错,但是中间跳转就不会报错。
6、如何由QString转化为char数组
QString str;
char* ch;
QByteArray ba = str.toLatin1();
ch=ba.data();
or
std::string str = qstr.toStdString();
const char* ch = str.c_str();
7、 error: ‘void QTimer::timeout()’ is protected within this context connect(timer, &QTimer::timeout, this, &RelayController::onTimeout);
使用新风格会报错。
//old style
connect(timer, SIGNAL(timeout()), this, SLOT(onTimeout()));
//new style
//connect(timer, &QTimer::timeout, this, &RelayController::onTimeout);
8、close和hide区别
那么close和hide区别就很明显了: hide只是隐藏窗体。不会发送任何信号。 close一般也是隐藏窗口。但是它会发送QCloseEvent事件。你可以重写void QWidget::closeEvent(QCloseEvent * event) [virtual protected],可以隐藏widget或者不隐藏。Qt::WA_DeleteOnClose标志还会影响窗体在内存中的状态,如果设置了该标志,窗体就会被删除,而hide则不会。最后主窗体的close会导致整个程序的退出,而hide明显不会。
PS:再对一个窗体调用close函数后,如果再调用show(),这个窗体又会被显示出来。
9、QOBject及其之类不允许复制拷贝
QOject 中没有提供一个拷贝构造函数和赋值操作符给外界使用,其实拷贝构造和赋值的操作都是已经声明了的,但是它们被使用了Q_DISABLE_COPY () 宏放在了private区域。因此所有继承自QObject的类都使用这个宏声明了他们的拷贝构造函数和赋值操作符为私有。
试想如果我们有一个QPushButton对象btnSubmit,如果我们可以复制出一个和btnSubmint完全一样的button对象,那么新的button对象的名字应该是什么?如果也叫btnSubmit,当我们给其中的btnSubmit接收事件或发出信号时,系统如何区分把事件由哪个button对象接收,或者哪个对象发送了信号?
10、QT获取系统屏幕分辨率
QDesktopWidget* desktopWidget = QApplication::desktop();
//获取可用桌面大小
QRect deskRect = desktopWidget->availableGeometry();
//获取设备屏幕大小
QRect screenRect = desktopWidget->screenGeometry();
11、Qt如何去掉按钮等控件的虚线框(焦点框
pushButton->setFocusPolicy(Qt::NoFocus)
pushButton->setStyleSheet("outline: none");
pushButton->setStyleSheet("padding: -1");
playVideoButton->setEnable(false);
12、Qt 中QString 字符串操作:连接、组合、替换、去掉空白字符
使用加号或者str = QString("%1 was born in %2.").arg("Joy").arg(1993);
13、键盘事件案例
void MainForm::keyPressEvent(QKeyEvent *ev)
{
if(ev->key() == Qt::Key_F5)
{
ui->stackedWidget->reloadPage();
return;
}
QWidget::keyPressEvent(ev);
}
void MainForm::keyReleaseEvent(QKeyEvent *ev)
{
if(ev->key() == Qt::Key_F5)
{
ui->stackedWidget->reloadPage();
return;
}
QWidget::keyReleaseEvent(ev);
14、boder:none问题
如果在一个按钮的样式中添加了这个属性,图片会变得有点细和颜色淡。
网上搜索了很多也找不到结果。
PS:border:none和border:0的区别。
15、error:crosses initialization of ...
switch(x) {
case 1:
int tmp = 2;
case 2:
continue;
default:
break;
}
上面tmp的作用域是switch整个区域,如果x!=1就会出现tmp未定义错误,所以要么添加大括号,要么写在外面声明。
16、Linux下QT执行shell命令
#inlucde <QProcess>
QProcess::execute("ls");
system("ls");//调用Linux C函数库中的system(const char *string);
QProcess *proc = new QProcess;
proc->start("ls");
可以使用这个进行调用python文件,并且使用start可以获取shell命令的返回值。
注意:解决QProcess对象调用execute执行cmd命令不支持中文和空格的问题
QProcess pro(0);
QString t1 ="C:/Documents and Settings/Administrator/桌面/新建文件夹/regasm2.0.exe";
QStringList t2;
t2.append("/s");
t2.append("/nologo");
t2.append("/codebase");
t2.append("C:/aa.dll");
int bret = pro.execute(t1,t2);
17、Qt中控件new之后需不需要delete的问题
这里也牵涉到内存管理机制
可以参考文章:https://blog.csdn.net/Aidam_Bo/article/details/85698862
QT的父子对象机制是在 QWidget和QOject中实现的。当我们使用父对象来创建一个对象的时候 ,父对象会把这个对象添加到自己的子对象列表中。当这个父对象被删除的时候,它会遍历它的子对象类表并且删除每一个子对象,然后子对象们自己再删除它们自己的子对象,这样递归调用直到所有对象都被删除。 这种父子对象机制会在很大程度上简化我们的内存管理工作,减少内存泄露的风险。我们需要显式删除(就是用Delete删除)的对象是那些使用new创建的并且没有父对象的对象(切记是new的才要delete,通过成员函数获得的对象,没有特殊说明的,千万不要随便delete.)。如果我们在删除一个对象的父对象之前删除它,QT会自动地从它的父对象的子对象列表中移除它的。
Qt 自动回收不像Java这种,有垃圾回收机制。 Qt 自动回收是靠父子关系。父亲销毁了。他的孩子也销毁。 所以为什么main函数里面main widget/dialog/mainWindow是分配在栈上的原因。其他new出来的东西都以这个widget作为父亲。 当程序最后结束了,main widget弹栈。父类被销毁。子类跟着被销毁。 所以如果你自己new 出来的。没有父类,不删除就会造成内存泄漏。
#include "mainwindow.h"
#include <QApplication>
#include <QTextCodec>
#include <QLabel>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
QLabel *label =new QLabel("hello",&w);
//这里使用new之后不需要执行delete,因为label的父类是w,而w是在栈中创建,在程序关闭的时候会自动释放,所以作为w的子类内存也被释放。
QLabel *label1 =new QLabel("world");
//这个是需要执行delete label1,否则会造成内存泄漏,因为label没有父类,所以不会为label释放内存
w.show();
a.exec();
delete label1;
label1=NULL;
return 0;
}
卧槽无情,写代码要注意了,并不是所有在类中new的对象就是它的子类,检查检查检查。
纯c++的问题,其实基本上Qt已经自成一个阵营了。c++里面new出来的,你自己需要delete置空,但是Qt只要继承QObject,也就是说在对象树系统里,一般只要你delete ui,那么很多new出来的,你自己不用管的,Qt核心会帮你完成。而纯c++不行 。
18、qt编译解决-make[1]:lrelease:未找到命令
ts文件翻译命令,需要安装。
apt install -y qt5-linguist
19、defaultServiceProvider::requestService(): no service found for - "org.qt-project.qt.camera"
发现在
“彩虹屁,网络流行语,饭圈常用语,最早流行起来的时间是在2017年。意思为粉丝们花式吹捧自己的偶像,浑身是宝,全是优点,字面意思为就连偶像放屁都能把它出口成章面不改色的吹成是彩虹。”
提示Windows已遇到关键问题一分钟后自动重新启动怎么办
sfc/verifyonly 扫描问题
sfc/scannow 修复问题
shutdown-a 命令 强制取消重启
https://github.com/flaneur2020/pua-lang https://flaneur2020.github.io/pua-lang/?s=BQRgDABA1BBMCUEBUEDMkYFYg