QT问题集锦-从学习Qt遇到的各种问题
qt开发遇到的问题及解决方法

qt开发遇到的问题及解决方法以"Qt开发中遇到的问题及解决方法"为题,本文将探讨在Qt开发过程中常见的问题,并提供相应的解决方法。
Qt是一个跨平台的C++应用程序开发框架,被广泛应用于图形用户界面(GUI)和嵌入式系统开发中。
然而,Qt开发也存在一些常见问题,下面将对其中一些问题进行详细讨论。
1. 问题:Qt应用程序无法正常编译和构建解决方法:首先,检查是否正确安装了Qt开发工具和相关的编译器。
其次,确保项目文件(.pro)中的配置正确,并且必要的库文件和头文件路径设置正确。
还可以尝试清理构建目录并重新构建项目。
如果问题仍然存在,可以查看编译器输出的错误信息,并根据错误信息进行逐步排查。
2. 问题:Qt应用程序运行时出现崩溃或异常终止解决方法:首先,检查代码中是否存在内存访问错误、空指针引用或数组越界等问题。
其次,使用调试工具(如Qt Creator的调试器)对程序进行调试,以定位问题所在。
可以使用断点来逐步执行代码,并观察变量的值是否符合预期。
另外,注意处理异常情况和错误,确保代码的健壮性。
3. 问题:Qt界面显示异常或错位解决方法:首先,检查界面布局文件(.ui)中是否存在错误的布局设置或控件属性。
其次,确保界面元素的大小和位置设置正确,并且与不同屏幕分辨率的适配有关的代码正确实现。
还可以使用Qt 的布局管理器来自动调整界面元素的布局和大小,以适应不同的屏幕尺寸。
4. 问题:Qt界面响应慢或卡顿解决方法:首先,检查是否存在耗时的操作阻塞了主线程,例如在UI线程中执行了大量计算或IO操作。
如果有耗时操作,可以将其放在后台线程中执行,以避免阻塞UI线程。
其次,优化代码和算法,减少不必要的计算和资源消耗。
另外,可以使用Qt的定时器机制来分批处理耗时任务,以保持界面的流畅性。
5. 问题:Qt应用程序在不同平台上的兼容性问题解决方法:首先,确保代码中没有使用特定于某个平台的API或特性。
Qt中文乱码解决方案

Qt中⽂乱码解决⽅案⼀、问题是什么?在学习Qt编程的过程中,⼤多数⼈都遇到过中⽂乱码的问题。
总结起来有三类:1. Qt Creator中显⽰的汉字变为乱码,编辑器上⽅有“Could not decode "..." with "UTF-8"-encoding. Editing not possible.”的错误提⽰。
此时,出现乱码的⽂档是不可编辑的。
2. Qt Creator中显⽰的汉字正常,但编译的时候会出现“常量中有换⾏符”等⼀系列错误报警。
其实,这也是⽂字编码的问题。
3. 编译时未报错,但⽣成的程序中⽂乱码。
原因. Qt Creator的编辑器默认使⽤UTF-8(代码页65001)编码来读取⽂本⽂件。
⽽Visual Studio保存⽂件时默认采⽤的是本地编码,对于简体中⽂的Windows操作系统,这个编码就是GB2312(代码页936)。
如果使⽤Qt Creator读取由Visual Studio创建的⽂件,那么编辑器就会以UTF-8编码格式读取GB2312编码格式的⽂件,出现中⽂乱码,因为这两套编码系统对汉字编码是不同的。
⾄于英⽂部分不会乱码,是因为UTF-8和GB2312在单字节字符部分是兼容的。
解决办法:⾸先,要把项⽬中所有的头⽂件和源⽂件全都转换成UTF-8+BOM编码保存,全选⽂本,然后右键选择Add UTF-8 BOM on save。
1. 第1个问题不存在了。
2. 第2个问题也不存在了。
3. 第3个问题,你也可以⽤上个⽅案中的⽅法来解决,但有更好的⽅法。
那就是要⽤到中⽂字符的头⽂件和源⽂件开头加上MSVC的⼀个宏:1#if _MSC_VER >= 16002#pragma execution_character_set("utf-8")3#endif。
Qt笔试题集锦-单选48题+多选34题(带答案)

Qt笔试题单选48题+多选34题(带答案)1. 在Qt中,如何在QML中定义一个自定义的信号?A. 使用signal关键字B. 使用emit关键字C. 使用declare关键字D. 使用define关键字答案:A2. 在Qt中,如何在QGraphicsScene中添加文本项?A. 使用addText()方法B. 使用addItem()方法C. 使用addLabel()方法D. 使用createText()方法答案:A3. 下面代码段的输出是什么?QVector<int> vec = {1, 2, 3, 4};vec.replace(1, 5);qDebug() << vec;A. (1, 2, 3, 4)B. (1, 5, 3, 4)C. (5, 2, 3, 4)D. (1, 2, 5, 4)答案:B4. 在Qt中,如何确保QPainter对象支持在抗锯齿模式下进行绘图?A. QPainter::setAntialiasing(true)B. QPainter::AntialiasingC. QPainter::setRenderHint(QPainter::Antialiasing, true)D. QPainter::setSmoothRendering(true)答案:C5. 下面代码段的输出是什么?QHash<QString, int> hash;hash["one"] = 1;hash["two"] = 2;hash["three"] = 3;qDebug() << hash.size();A. 1B. 2C. 3D. 0答案:C6. 在Qt中,如何在一个QWidget上设置自定义绘图背景?A. 重写paintEvent()B. 重写drawEvent()C. 重写renderEvent()D. 重写backgroundEvent()答案:A7. 下面代码段的输出是什么?QList<int> list = {1, 2, 3, 4};list.removeOne(3);qDebug() << list;A. (1, 2, 3, 4)B. (1, 2, 4)C. (2, 3, 4)D. (1, 3, 4)答案:B8. 在Qt中,如何在QWidget中捕获并处理键盘事件?A. 重写keyPressEvent()B. 重写keyEvent()C. 重写keyboardEvent()D. 重写keyInputEvent()答案:A9. 下面代码段的输出是什么?QString str = "Hello, World!";qDebug() << str.section(',', 1, 1).trimmed();A. "Hello"B. " World!"C. "World"D. " World"答案:C10. 在Qt中,如何设置QMainWindow的中央小部件?A. setCentralWidget()B. addCentralWidget()C. setMainWidget()D. addMainWidget()答案:A11. 下面代码段的输出是什么?QSet<int> set = {1, 2, 3, 4};set.remove(2);qDebug() << set;A. {1, 2, 3, 4}B. {1, 3, 4}C. {2, 3, 4}D. {1, 2, 4}答案:B12. 在Qt中,QTimer对象的用途是什么?A. 提供线程管理B. 提供定时功能C. 提供信号槽连接D. 提供文件管理答案:B13. 下面代码段的输出是什么?QString str = "abcdef";qDebug() << str.contains("cd");A. trueB. falseC. 1D. 0答案:A14. 在Qt中,如何在QPushButton上设置图标?A. setIcon()B. addIcon()C. setButtonIcon()D. addButtonIcon()答案:A15. 下面代码段的输出是什么?QVector<int> vec = {10, 20, 30, 40};qDebug() << vec.first() << st();A. 10 40B. 10 30C. 20 40D. 20 30答案:A16. 在Qt中,如何在QGraphicsScene中添加一个图形项?A. addItem()B. addGraphic()C. appendItem()D. insertGraphic()答案:A17. 下面代码段的输出是什么?QMap<QString, int> map;map.insert("A", 1);map.insert("B", 2);map.insert("C", 3);qDebug() << map.value("B");A. 1B. 2C. 3D. 0答案:B18. 在Qt中,如何捕获QWidget的鼠标移动事件?A. 重写mouseMoveEvent()B. 重写mouseEvent()C. 重写mouseDragEvent()D. 重写mouseTrackEvent()答案:A19. 下面代码段的输出是什么?QList<int> list = {1, 2, 3, 4};list.append(5);qDebug() << list.size();A. 4B. 5C. 6D. 7答案:B20. 在Qt中,如何在QTableView中设置列宽?A. setColumnWidth()B. setColumnSize()C. setWidth()D. setColumnSpan()答案:A21. 下面代码段的输出是什么?QHash<int, QString> hash;hash[1] = "one";hash[2] = "two";hash[3] = "three";qDebug() << hash.contains(2);A. trueB. falseC. 1D. 0答案:A22. 在Qt中,如何在QGraphicsScene中添加一个文本项?A. addText()B. addLabel()C. addItem()D. addString()答案:A23. 下面代码段的输出是什么?QVector<int> vec = {1, 2, 3, 4};vec.clear();qDebug() << vec.isEmpty();A. trueB. falseC. 1D. 0答案:A24. 在Qt中,如何在QComboBox中添加一个选项?A. addItem()B. appendItem()C. insertItem()D. setItem()答案:A25. 下面代码段的输出是什么?QString str = "12345";qDebug() << str.at(2);A. "1"B. "2"C. "3"D. "4"答案:C26. 在Qt中,如何在QWidget中启用鼠标追踪?A. setMouseTracking(true)B. enableMouseTracking(true)C. setTracking(true)D. enableTracking(true)答案:A27. 下面代码段的输出是什么?QList<int> list = {1, 2, 3, 4};list.replace(2, 5);qDebug() << list;A. (1, 2, 3, 4)B. (1, 2, 5, 4)C. (1, 5, 3, 4)D. (5, 2, 3, 4)答案:B28. 在Qt中,如何在QWidget中捕获窗口关闭事件?A. 重写closeEvent()B. 重写destroyEvent()C. 重写exitEvent()D. 重写shutdownEvent()答案:A29. 下面代码段的输出是什么?QVector<int> vec = {1, 2, 3, 4};vec.replace(1, 5);qDebug() << vec;B. (1, 5, 3, 4)C. (5, 2, 3, 4)D. (1, 2, 5, 4)答案:B30. 下面代码段的输出是什么?QHash<QString, int> hash;hash["one"] = 1;hash["two"] = 2;hash["three"] = 3;qDebug() << hash.size();A. 1B. 2C. 3D. 0答案:C31. 下面代码段的输出是什么?QList<int> list = {1, 2, 3, 4};list.removeOne(3);qDebug() << list;A. (1, 2, 3, 4)C. (2, 3, 4)D. (1, 3, 4)答案:B32. 下面代码段的输出是什么?QString str = "Hello, World!";qDebug() << str.section(',', 1, 1).trimmed();A. "Hello"B. " World!"C. "World"D. " World"答案:C33. 下面代码段的输出是什么?QSet<int> set = {1, 2, 3, 4};set.remove(2);qDebug() << set;A. {1, 2, 3, 4}B. {1, 3, 4}C. {2, 3, 4}D. {1, 2, 4}答案:B34. 下面代码段的输出是什么?QString str = "abcdef";qDebug() << str.contains("cd");A. trueB. falseC. 1D. 0答案:A35. 下面代码段的输出是什么?QVector<int> vec = {10, 20, 30, 40};qDebug() << vec.first() << st();A. 10 40B. 10 30C. 20 40D. 20 30答案:A36. 下面代码段的输出是什么?QMap<QString, int> map;map.insert("A", 1);map.insert("B", 2);map.insert("C", 3);qDebug() << map.value("B");A. 1B. 2C. 3D. 0答案:B37. 下面代码段的输出是什么?QList<int> list = {1, 2, 3, 4};list.append(5);qDebug() << list.size();A. 4B. 5C. 6D. 7答案:B38. 下面代码段的输出是什么?QHash<int, QString> hash;hash[1] = "one";hash[2] = "two";hash[3] = "three";qDebug() << hash.contains(2);A. trueB. falseC. 1D. 0答案:A39. 下面代码段的输出是什么?QVector<int> vec = {1, 2, 3, 4};vec.clear();qDebug() << vec.isEmpty();A. trueB. falseC. 1D. 0答案:A40. 下面代码段的输出是什么?QString str = "12345";qDebug() << str.at(2);A. "1"B. "2"C. "3"D. "4"答案:C41. 下面代码段的输出是什么?QList<int> list = {1, 2, 3, 4};list.replace(2, 5);qDebug() << list;A. (1, 2, 3, 4)B. (1, 2, 5, 4)C. (1, 5, 3, 4)D. (5, 2, 3, 4)答案:B42. 下面代码段的输出是什么?QSet<int> set = {1, 2, 3, 4};qDebug() << set.size();A. 1B. 2C. 3D. 4答案:D43. 下面代码段的输出是什么?QMap<QString, int> map;map.insert("key1", 1);map.insert("key2", 2);map.insert("key3", 3);qDebug() << map.keys().contains("key2");A. trueB. falseC. 1D. 0答案:A44. 下面代码段的输出是什么?QString str = "Hello Qt!";qDebug() << str.indexOf("Qt");A. 1B. 0C. 6D. 5答案:C45. 下面代码段的输出是什么?QVector<int> vec = {1, 2, 3, 4, 5};vec.remove(1);qDebug() << vec;A. (1, 2, 3, 4, 5)B. (1, 3, 4, 5)C. (2, 3, 4, 5)D. (1, 3, 5)答案:B46. 下面代码段的输出是什么?QMap<int, QString> map;map.insert(1, "one");map.insert(2, "two");map.insert(3, "three");map.remove(2);qDebug() << map.size();A. 1B. 2C. 3D. 0答案:B47. 下面代码段的输出是什么?QString str = "OpenAI";qDebug() << str.left(4);A. "Open"B. "AI"C. "OpenAI"D. "penA"答案:A48. 下面代码段的输出是什么?QVector<int> vec = {1, 2, 3, 4};vec.swap(1, 3);qDebug() << vec;A. (1, 2, 3, 4)B. (1, 4, 3, 2)C. (4, 2, 3, 1)D. (1, 3, 2, 4)答案:B多选题1. 下面哪些类是QObject的直接子类?A. QWidgetB. QTimerC. QThreadD. QString答案:A, B, C2. 以下哪些关于信号和槽的描述是正确的?A. 信号和槽可以跨线程连接B. 槽函数必须是QObject的成员函数C. 自定义信号必须在signals关键字下声明D. 槽函数可以是普通函数答案:A, C, D3. 以下哪些类支持QPainter的绘图操作?A. QPixmapB. QImageC. QSvgRendererD. QPicture答案:A, B, D4. 以下哪些关于QEventLoop的描述是正确的?A. QEventLoop可以用于实现事件驱动的编程B. QEventLoop可以嵌套使用C. QEventLoop必须在主线程中运行D. QEventLoop可以手动停止答案:A, B, D5. 下面哪些类可以用于处理XML数据?A. QDomDocumentB. QXmlStreamReaderC. QXmlStreamWriterD. QJsonDocument答案:A, B, C6. 以下哪些是QVariant类支持的数据类型?A. intB. doubleC. QStringD. QVector答案:A, B, C7. 下面哪些类可以用于管理应用程序的配置设置?A. QSettingsB. QConfigC. QPreferencesD. QIniSettings答案:A8. 以下哪些QNetworkAccessManager的操作类型是正确的?A. GETB. POSTC. PUTD. DELETE答案:A, B, C, D9. 下面哪些QMainWindow的区域可以放置小部件?A. CentralWidgetB. ToolBarAreaC. StatusBarD. DockWidgetArea答案:A, B, D10. 以下哪些关于QThread的描述是正确的?A. QThread不能直接创建线程B. QThread::run()函数必须重写C. moveToThread()可以将QObject对象移动到另一个线程D. QThread可以使用信号和槽与主线程通信答案:B, C, D11. 下面哪些类可以用于处理音频数据?A. QMediaPlayerB. QAudioInputC. QSoundD. QAudioOutput答案:A, B, D12. 以下哪些是QGraphicsView的功能?A. 支持平移和缩放B. 支持鼠标事件C. 支持多场景显示D. 支持自定义绘图答案:A, B, D13. 下面哪些关于QTimer的描述是正确的?A. QTimer可以单次触发或周期性触发B. QTimer必须在主线程中使用C. QTimer::timeout()信号可以连接到槽函数D. QTimer可以用于精确定时任务答案:A, C14. 以下哪些类支持多媒体文件的播放?A. QMediaPlayerB. QSoundEffectC. QVideoWidgetD. QMediaRecorder答案:A, B15. 下面哪些QWidget的事件处理函数是有效的?A. mousePressEvent()B. keyPressEvent()C. paintEvent()D. wheelEvent()答案:A, B, C, D16. 以下哪些是QAbstractItemModel的子类?A. QStandardItemModelB. QFileSystemModelC. QStringListModelD. QTableWidgetItem答案:A, B, C17. 下面哪些关于Qt容器类的描述是正确的?A. QList可以存储任何类型的数据B. QMap按键值对存储数据C. QVector是一个动态数组D. QSet是一个无序集合答案:A, B, C, D18. 以下哪些类可以用于处理JSON数据?A. QJsonDocumentB. QJsonArrayC. QJsonObjectD. QJsonValue答案:A, B, C, D19. 下面哪些类可以用于网络请求?A. QTcpSocketB. QUdpSocketC. QHttpServerD. QNetworkAccessManager答案:A, B, D20. 以下哪些是QFile类的功能?A. 读取和写入文件B. 创建和删除文件C. 文件重命名D. 文件权限管理答案:A, B, C, D21. 以下关于"QList" 和"QVector" 的描述哪些是正确的?A. "QList" 可以存储任何类型的数据,包括指针和复杂对象。
QT常见问题

校验和d它通常是以十六进制为数制表示的形式。
如果校验和的数值超过十六进制的FF,也就是255. 就要求其补码作为校验和。
通常用来在通信中,尤其是远距离通信中保证数据的完整性和准确性.这些数据项可以是数字或在计算检验的过程中看作数字的其它字符串.校验和(checksum)是指传输位数的累加,当传输结束时,接收者可以根据这个数值判断是否接到了所有的数据。
如果数值匹配,那么说明传送已经完成。
TCP和UDP传输层都提供了一个校验和与验证总数是否匹配的服务功能.#include〈QtSerialPort/QSerialPort> 窜口头文件#include〈QtCore/QtGlobal> 核心头文件#include〈QtSerialPort/QSerialPort〉窜口头文件#include〈QWaitCondition> 等待头文件里面包含wake()函数//**************#include<QProgressBar>进度条类#include〈QLCDNumber>数字显示框类#include〈QScrollBar>滚动条类#include<QSpinBox>微调框类#include<QSlider>滑动条类#include<QIconView>图标视图类#include<QListView〉列表视图类#include〈QListBox〉列表框类#include<QTable>表格类#include<QValidator>有效性检查类#include<QImage〉图像类#include〈QMainWindow〉主窗口类#include〈QPopupMenu〉弹出性菜单类#include〈QMenuBar>菜单栏类#include〈QToolButton>工具按钮类#include<QToolTip〉提示类#include<QWhatsThis〉这是什么类#include<QAction>动作类#include<QHBoxLayout〉水平布局类#include<QVBoxLayout〉垂直布局类#include〈QGridLayout>网格布局类QT对话框类#include<QMessageBox>消息对话框类#include〈QProgressDialog>进度条对话框#include<QWizard>向导对话框类#include<QFileDialog〉文件对话框#include〈QColorDialog>颜色对话框#include〈QFontDialog>字体对话框#include<QPrintDialog〉打印对话框//***************class groupbox 显示虚线分割线QwtPlot是用来绘制二维图像的widget,在它的画板上可以无限制的显示绘画组件.绘画组件可以是曲线(QwtPlotCurve)、标记(QwtPlotMark)、网格(QwtPlotGrid)、或者其它从QwtPlotItem继承的组件、QwtScaleDraw可以用来绘制线性或对数尺度,一个标尺可以指定位置、对齐方式、长度等。
QT中TCP通信及遇到的问题

QT中TCP通信及遇到的问题以⾃定数据包格式进⾏通信数据包格式如下:服务端代码如下:。
cpp⽂件:主界⾯程序会发送emit sendTime()和emit sendOCRMsg(OCRMsg, dateTime)信号对应HeratPack和sendData槽函数#include "TCPthread.h"#include <qdebug.h>#include <qtimer.h>#include <qthread.h>#include <qdatastream.h>TCPthread::TCPthread(QObject *parent){qDebug() << "TCPthread线程id:" << QThread::currentThread();tcpServer = NULL;//监听套接字,指定⽗对象,让其⾃动回收空间tcpServer = new QTcpServer(this);tcpServer->listen(QHostAddress::AnyIPv4, 8888);//当有客服端连接时connect(tcpServer, &QTcpServer::newConnection,this,&TCPthread::createSocket);//-----------------------------------------------------------------------------------------------}void TCPthread::createSocket() {//取出建⽴好连接的套接字QTcpSocket *tcpSocket = tcpServer->nextPendingConnection();socketList.push_back(tcpSocket);//获取客户端的IP和端⼝QString ip = tcpSocket->peerAddress().toString();qint16 port = tcpSocket->peerPort();IPort = QString("TCPClient-[%1:%2]:成功连接").arg(ip).arg(port);qDebug() << IPort;connect(tcpSocket, &QTcpSocket::connected,[=]() {qDebug() << "成功和服务器建⽴好连接";});//接受客服端的数据connect(tcpSocket, &QTcpSocket::readyRead,this, &TCPthread::readData);//当客户端断开连接connect(tcpSocket, &QTcpSocket::disconnected, this, &TCPthread::clientDiscon);}//从客户端读取数据void TCPthread::readData() {//从通信套接字中取出内容if (socketList.size() != 0) {for (int i = 0; i < socketList.size(); i++){QByteArray array = socketList[i]->readAll();}}}//客户端断开连接void TCPthread::clientDiscon() {//与服务器连接的客户端QTcpSocket *tcpsocket = qobject_cast<QTcpSocket*>(QObject::sender());//移除socketList.removeOne(tcpsocket);qDebug() << "Client-IP:" << tcpsocket->peerAddress().toString() << "断开连接";tcpsocket->deleteLater();}//TCP服务器发送板坯报⽂数据槽函数void TCPthread::sendData(QString OCR_Msg, QDateTime dateTime) {//封装包头QByteArray sendOCRByte;//⽤于发送数据的字节数组QDataStream out(&sendOCRByte, QIODevice::WriteOnly);//使⽤数据流写⼊数据out.setByteOrder(QDataStream::LittleEndian);//设置⼩端模式out << ushort(0) << m_OCRPackID;//占位符,这⾥必须要先这样占位,然后后续读算出整体长度后在插⼊qDebug() << "报⽂头长度:" << sendOCRByte.length();//4//封装数据QString s_data = OCR_Msg + dateTime.toString("yyyy-MM-dd hh:mm:ss.zzz") +"0";qDebug() << s_data << "字符串长度:" << s_data.length();//48QByteArray ba = s_data.toLocal8Bit(); //字符串转字节数组qDebug() << "字符字节数组长度:" << ba.length(); //48//---------------------------------------------------------char * c_data;c_data = ba.data();sendOCRByte.append(c_data);//在4个字节数组中添加48个字符串//---------------------------------------------------------out.device()->seek(0);//回到数据流开头,插⼊数据的长度ushort t_len = (ushort)(sendOCRByte.length());out << t_len;qDebug() << "板坯报⽂长度:" << t_len;//52//发送数据|多例if (socketList.size() != 0) {for (int i = 0; i < socketList.size(); i++){socketList[i]->write(sendOCRByte);socketList[i]->flush();}}}//发送⼼跳报⽂void TCPthread::HeratPack() {if (socketList.size() != 0) {for (int i = 0; i < socketList.size(); i++){//⽤于⼼跳报⽂要发送的数据QByteArray sendHeartByte;//使⽤数据流写⼊数据QDataStream out(&sendHeartByte, QIODevice::WriteOnly);//设置⼩端模式out.setByteOrder(QDataStream::LittleEndian);//占位符,这⾥必须要先这样占位,然后后续读算出整体长度后在插⼊out << ushort(0) << m_heartPackID ;//回到⽂件开头,插⼊数据的长度out.device()->seek(0);ushort len = (ushort)(sendHeartByte.size());out << len;//4qDebug() <<"⼼跳报⽂长度:" << len << "⼼跳报⽂ID:" << m_heartPackID;//往套接字缓存中写⼊数据,并发送socketList[i]->write(sendHeartByte);socketList[i]->flush();}}}TCPthread::~TCPthread(){//主动和客户端断开连接if (socketList.size() != 0) {for (int i = 0; i < socketList.size(); i++){socketList[i]->disconnectFromHost();socketList[i]->close();socketList[i] = NULL;delete socketList[i];}}delete tcpServer;}遇到的问题:1、⼼跳报⽂中为发送4个字节长度报⽂:两个quint16类型的数据均占2个字节,甲⽅并要求使⽤⼩端模式解决办法:使⽤QByteArray字节数组进⾏写⼊2、数据报⽂中,需使⽤ushort类型2个占4个字节和48个字节字符串共52个字节解决办法:前⾯ushort类型使⽤QDataStraem类型写到QByteArray中。
Qt---一些常见问题处理(无法解析得外部符号,UI头文件找不到等)

Qt---⼀些常见问题处理(⽆法解析得外部符号,UI头⽂件找不到等)1.编译,出错,提⽰:mainwindowprivate.obj:-1: error: LNK2001: ⽆法解析的外部符号 "public: virtual struct QMetaObject const * __cdecl MainWindowPrivate::metaObject(void)const " (?metaObject@MainWindowPrivate@@UEBAPEBUQMetaObject@@XZ)从QObject继承了⼀个类:#ifndef MAINWINDOWPRIVATE_H#define MAINWINDOWPRIVATE_H#include "DockManager.h"class MainWindowPrivate : public QObject{Q_OBJECTpublic:MainWindowPrivate();virtual ~MainWindowPrivate();public:void initDockWidget(QWidget *widget);private:ads::CDockManager *DockManager;};#endif// MAINWINDOWPRIVATE_H编译,出错,提⽰:mainwindowprivate.obj:-1: error: LNK2001: ⽆法解析的外部符号 "public: virtual struct QMetaObject const * __cdecl MainWindowPrivate::metaObject(void)const " (?metaObject@MainWindowPrivate@@UEBAPEBUQMetaObject@@XZ)解决办法:编译出错是因为没有⽣成moc_mainwindowprivate.cpp⽂件造成的。
QT简答+大题+填空

1、创建一个窗体对象后,要想显示该窗体,需要调用对象的_show()______方法,要想隐藏该窗体需要调用对象的__hide()_____方法。
2、MinGW 即Minimalist ____GNU_______For Windows,是将___GNU_开发工具移植到Win32 平台下的产物。
3 、Qt Creator 提供的默认基类只有QMainWindow 、_QWidget__ 和__QDialog___________三种。
4 、在命令行编译程序时,其中使用命令qmake – project 的作用是:_生成*.pro工程文件_;将.ui 文件编译成.h 文件时,使用了_Qt Designer编译工具。
5、使QTimer 对象开始计时的方法是__start()____。
6、信号与槽机制中,发射信号的关键字是_emit____________。
7、创建一个窗体对象后,要想显示该窗体,需要调用对象的__________方法,要想隐藏该窗体需要调用对象的_________方法。
8、使QTimer 对象开始计时的方法是______________。
9、设置QLabel 对象显示文本内容的方法是__setText()_。
10 、Qt 中的常用标准对话框有_颜色对话框__ 、_消息对话框_ 、_输入对话框__。
11、Qt 中常用的布局管理器有_垂直布局管理器_、_水平……和_垂直布局管理器等。
12、Qt 的按钮控件是哪个类_QPushButton,标签是哪个类QLabel_,文本控件是哪个类QTextEdit_。
13、当某个事件出现时,通过发送_______信号___,可以将与之相关的_槽函数激活,即执行槽函数代码。
14、使用元对象编译器,将自定义类声明放在头文件中,并在第一句加上宏__Q_Object________ ,使用qmake 工具生成_makefile_ ,则makefile 会自动调用__moc_工具对自定义信号和槽进行处理。
从QT4升级到QT5遇到的问题汇总及解决方法

从QT4升级到QT5遇到的问题汇总及解决方法PC部分:【改QTDIR变量】在工程根目录下找到.user文件, 如er修改指向你的QT5根目录:<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Template|Win32'"><QTDIR>C:\qt\Qt5.2.1\5.2.1\msvc2010</QTDIR></PropertyGroup>或者找到这个文件Qt4VSPropertySheet.props,在里面修改:<PropertyGroup Label="UserMacros"><QTDIR>c:\Qt\Qt5.2.1\5.2.1\msvc2010</QTDIR></PropertyGroup>【新增QtWidgets模块】相对于QT4, QT5的一个主要的基础架构修改是,将widget从QtGui模块剥离开来,新增QtWidgets模块,头文件包含“QtWidgets”。
#include <QtGui/QDialog>#include <QtGui/QTableView> ......修改为:#include<QtWidgets/qdialog.h>#include <QtWidgets/QTableView> ......#include <QWidget> 修改为#include <QtWidgets/QWidget> ......#include <QListWidgetItem>修改为#include <QtWidgets/qlistwidget.h>.pro文件中Qt += widgets【QApplication放入QtWidgets】#include <QApplication>改成:#include <QtWidgets/QApplication>【新增QtWetKitWidgets模块】头文件包含要加QtWebKitWidgets目录.#include <QtWebKit/QWebFrame> 替换为:#include<QtWebKitWidgets/ QWebFrame > #include <QtWebkit/QWebView> 替换为:#include<QtWebKitWidgets/ QWebView >.pro文件中Qt += webkitwidgets【QSortFilterProxyModel】#include <QtGui/QSortFilterProxyModel>修改为:#include <QtCore/QSortFilterProxyModel>【QDesktopServices::storageLocation系统目录问题】前使用QDesktopServices::storageLocation(QDesktopServices::xxxx)来获取一些系统目录,现在则要改成QStandardPaths::writableLocation(QStandardPaths::xxxx)如:QString directory = QDesktopServices::storageLocation(QDesktopServices::DataLocation);可修改为:QString directory = QStandardPaths::writableLocation(QStandardPaths::DataLocation);而QString location = QDesktopServices::storageLocation(QDesktopServices::CacheLocation);修改为:QString location = QStandardPaths::writableLocation(QStandardPaths::CacheLocation);【QHttp用QNetworkAccessManager代替】QHttp类已经被废弃,请用以下的类替换QNetworkAccessManagerQNetworkReplyQNetworkRequest(代替QHttpRequestHeader)m_pReply = m_httpManager.get(QNetworkRequest(url));connect(m_pReply, SIGNAL(readyRead()), this,SLOT(readyRead()));connect(m_pReply, SIGNAL(finished()),this, SLOT(finishDownload ()));connect(m_pReply, SIGNAL(error(QNetworkReply::NetworkError)), this,SLOT(networkError(Q NetworkReply::NetworkError)));m_pFile = new QFile(localPath);void MyClass::readyRead(){if(m_pFile)m_pFile->write(m_pReply->readAll());}void MyClass::finishDownload(){if(m_pFile->handle() != NULL){m_pFile->flush();m_pFile->close();}}【qInstallMsgHandler函数废弃】可修改为:qInstallMessageHandler,MessageOutput要多加一个参数: QMessageLogContext& Contextvoid MessageOutput( QtMsgType type, const QMessageLogContext& Context, const QString &sMsg )QtMsgHandler 改为QtMessageHandler【#include <QX11Info>问题】加路径:C:\Qt\Qt5.2.1\5.2.1\Src\qtx11extras\include修改为:#include <QtX11Extras\qx11info_x11.h>【RegisterDeviceNotification问题】RegisterDeviceNotification(this->winId(), &NotificationFilter, DEVICE_NOTIFY_ WINDOW_HANDLE);改成RegisterDeviceNotification((HANDLE)this->winId(), &NotificationFilter, DEVICE_NOTIFY_W INDOW_HANDLE);【setYMD不是成员函数的问题】把setYMD改为:setDateQDate.setYMD() 修改成QDate.setDate()【Q_WS_WIN问题】宏修改, Q_WS_WIN 可替换为:Q_OS_WIN【network模块引用问题】#ifdef WIN32#include "../../src/network/access/qnetworkreply.h"#include "../../src/network/access/QNetworkAccessManager.h"#include "../../src/network/kernel/QNetworkInterface.h"#else#include "src/network/access/s.h"#include "src/network/access/QNetworkAccessManager.h"#include "src/network/kernel/QNetworkInterface.h"#endif修改为:#include <QtNetwork/qnetworkreply.h>#include <QtNetwork/qnetworkaccessmanager.h>#include <QtNetwork/qnetworkinterface.h>【QAxWidget放入ActiveQt】#include <QAxWidget>修改为:#include <ActiveQt\QAxWidget>【QTextCodec编码函数已废弃】Qt5发布之时,默认将会是utf8编码,这些函数请去掉:QTextCodec::setCodecForTr(...)QTextCodec::setCodecForCStrings(...)QTextCodec::setCodecForLocale(...)【QWindowsStyle问题】窗体风格类QWindowsStyle移除了,使用QCommonStyle代替。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2>Inactive:未获得焦点的状态。
3>Disable:不可用状态。
通常情况下,Active状态与Inactive状态下颜色显示是一致的,当然也可根据需要设置成不一样的颜色
2、ColorRole(设置什么颜色)。
ColorRole指的是颜色主题,即对窗体中不同部位颜色的分类,如QPalette::Window是指背景色,QPalette::WindowText指的是前景色等。
其他两个一样。
5 int double char*转QString
一种方法可以先转string,再转QString。
另一种方法可以查看QString类的函数。
其一:静态函数QString number ( double n, char format = 'g', int precision = 6 )
qDebug()<<tr(st a=10;
QString b;
b=QString::number(a)
18 QString转int
QString a="120"
int b;
b=a.toInt()
--------------------------------------------------------------------
第一篇
1
问题描述:运行环境为Qt4.8.5+QtCreator3.0.0+VS2010专业版+Debuging Tools for Windows(x86),用Creator无法打开项目文件,截图如下:
弹出错误:Cannot read E:/PROJECT/Zhou-0410/testToolbar.pro:UnexpectedUTF-8 BOM
}
Globe.cpp
Globe::Globe()
{
}
Int Globe::num = 0;
9
double/float size = 2.3334524;
QString str = QString::number(size, 'f', 2);
其中f代表非科学计数法格式,2代表小数点后两位。
10
未连接QWT库need to link to the Qwt library.
3)默认的环境变量已经有了NMAKE路径
解决方法:把路径中非法字符删除即可
3
原因分析:未知,应该是非法字符导致。
4
原因分析:声明的函数,未实现,或在未实现它的情况下调用了它
解决方法:实现后再调用
5
问题描述:见图
解决方法:转换成utf8格式
6
问题描述:按照相对路径添加背景图片不显示
解决方法:
1)相对路径起始点为构建目录,如图
2)修改槽动作名称或重新生成槽动作,把之前代码拷贝到新槽动作中。
10 Qt
1)int转QString
int a=10;
QString b;
b=QString::number(a)
2)QString转int
QString a="120"
int b;
b=a.toInt()
3)int和枚举型转换
11
答:相对路径是Qt Creator构建目录
第三篇
11.
QwtPlotCanvas*canvas=newQwtPlotCanvas();
把new后面的括号去掉即可
5.1
1 char *与const char *的转换
char *ch1="hello11";
const char *ch2="hello22";
ch2 = ch1;//不报错,但有警告
5
问题描述:no matching function for call to……connect……
问题解析:我遇到过这种问题,应该是你&mDevice对应的类,没有继承QObject对象。Qt的信号-槽机制必须以QObject为基类才能使用。
6
参见QWT
7
8
Globe.h
Class globe
{
Static int num;
可采用static_cast
5.2
1)结构体转字符数组
structA
{
inta;
intb;
};
charbuf[100];
A a= {1,2};
memcpy(buf,&a,sizeof(A));
2)字符数组转结构体
5.3
QPalette类有两个枚举类型,
枚举
1、ColorGroup
CorGroup指的是3中不同的状态(什么时候设置颜色):
常用:
QPalete::Window,通常指窗口部件的背景色;
QPalette:WindowText,通常指窗口不见的前景色(QLabel也可以使用);
QPalette::Base,指文本输入窗口部件(比如QTextEdit,QLinedit,QPlainTextEdit等)的背景色
QPalette::Text,与QPalette::Base一块使用,指文本输入窗口部件的前景色;
其二:非静态函数,需构造QString实例来调用的QString & setNum ( double n, char format = 'g', int precision = 6 )
QString::number()这个静态函数,参数可以是int,也可以是double。
6 double int的互转
原因分析:未知
解决方法:
1安装VS2010SP1,未解决
2安装VS-Add,未解决
3使用Creator2.6解决
2
问题描述:见下图
原因分析:
1)可能:添加VS编译器环境变量,在PATH中添加VS中NMAKE路径
2)确定:Creator或编译器无法识别&符号,即路径原文件名为R&T中含有非法字符,无法准确识别路径
但是qDebug()<<tr(str);是不可以的,要想用tr()函数输出QString类型的字符则要如下:
qDebug()<<tr(str.toLatin1);
8 int转QString
int a=10;
QString b;
b=QString::number(a)
9 QString转int
QString a="120"
12 Qt4
ui->label->setText(QObject::trUtf8("尼玛"));
13 Qt
答:qcreator是用VS编译的,而QWT的DLL是用mgw编译的,所以qtreator无法显示出对应控件。
14
15
16
修改如下属性:minimumsize
第二篇
1
问题描述:被引用的函数无法解析
QString.toStdString().c_str();
4 int double char* --->string
可以采用<sstream>里的stringstream
以int为例,int a = 3;
stringstream ss;
string strInt;
ss<<a;
ss>>strInt;
qDebug()<<tr("print");
qDebug()<<ch;(ch为char类型)
qDebug()<<tr(ch);
qDebug()<<byteArray;(byteArray是QByteArray类型)
qDebug()<<tr(byteArray);
qDebug()<<str;(str为Qstring类型)
2)添加资源文件,把背景图片放到资源文件中,再通过控件属性,指定资源文件中的背景图片即可。
7
原因分析:可能是昨天在windows、system32里面添加了qtcore.dll等文件导致
解决方法:删除之后就可以运行了,但具体删除哪个,待定
8
9
解决方法:修改名称后,通常有以下步骤
1)在头文件中删除对应槽;
原因分析:引用的头文件只是变量及函数的定义说明,而函数实现部分都封装在对应的库中(lib+dll)
2
描述:Qt项目中添加的头文件一般是根据需求自己写的,而项目中需要引用大量的Qt自带头文件及系统头文件,有时也需要用到第三方专用头文件,不可能把所有的头文件都加到项目中。那该如何引用这些已有的头文件呢?这里分三类进行讨论:
QPalette::Button,指按钮窗口部件的背景色;
QPalette::ButtonText,指按钮窗口部件的前景色
QPalette::Highlight:用于设置文字高亮时的背景颜色
QPalette::HighlightedText:用于设置文字高亮时的颜色
QByteArray byte;
ch = byte.data();
14 char *转换为QByteArray
char *ch;
QByteArray byte;
byte = QByteArray(ch);
15 QString转换为QByteArray
QByteArray byte;
QString string;
byte = string.toAscii();
16 QByteArray转换为QString