C++系列三:QT初识2

这篇具有很好参考价值的文章主要介绍了C++系列三:QT初识2。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录
  • 代码参考:

前言:

我可没说放弃文章来源地址https://www.toymoban.com/news/detail-695016.html

Base class中的三个选项:
QMainWindow:主窗口类,包括菜单栏、工具栏、状态栏。
QWidget:可以创建一个空白的窗口,是所有界面组件的基类。
QDialog:对话框类。

Clang代码模型:
help->About Plugins…->C++->ClangCodeModel去掉勾选,再重启
会对源码进行分析,提供函数提示、代码补全等功能
会出现大量警告和错误提示
可以在Help->About Plugins中取消了该项(ClangCodeModel)

qmake是构建项目的软件,它根据.pro文件生成Makefile文件,然后C++编译器可以根据Makefile文件进行编译和链接
qmake还会自动生成MOC(meta-object compiler)和UIC(user interface compiler)生成构建规则
$$为替换函数的前缀

//Qt框架中的模块分为两大类:
-Qt 基本模块(Qt Essentials):提供了 Qt 在所有平台上的基本功能。
-Qt 附加模块(Qt Add-Ons):实现一些特定功能的模块。
基本模块:
Qt Core           //Qt框架的核心,定义了元对象系统
Qt GUI           //设计 GUI 界面的基础类,包括事件处理、文字处理等
Qt Widgets       //提供用于创建GUI的各种界面组件类
Qt D-Bus         //D-Bus是实现进程间通信(inter process communication,IPC)和远程过程调用(remote procedure call,RPC)的一种通信协议
Qt Test          //提供一些对应用程序和库进行单元测试的类
Qt QML           //提供用QML编程的框架,定义了QML和基础引擎
Qt Quick         //用于开发QML应用程序的标准库,提供创建UI的一些基本类型
Qt Quick Controls//提供一套基于Qt Quick的控件,可用于创建复杂的UI
Qt Quick Dialogs //提供通过QML使用系统对话框的功能
Qt Quick Layouts //提供用于管理界面布局的QML类型
Qt Quick Test    //提供QML应用程序的单元测试框架
其他模块:
自行添加。

//Qt的元对象系统
1. 元对象(meta object):每个QObject及其子类的实例都有一个元对象(静态变量staticMetaObject)。函数metaObject()可以返回它的指针。
2. 类型信息:QObject的inherits()函数可以判断继承关系。
3. 动态翻译:函数tr()返回一个字符串的翻译版本。
4. 对象树:表示对象间从属关系的树状结构。QObject提供了parent()、children()、findChildren()等函数。对象树中的某个对象被删除时,它的子对象也将被删除。
5. 信号和槽:对象间的通信机制。
6. 属性系统:可以使用宏Q_PROPERTY定义属性,QObject的setProperty()会设置属性的值或定义动态属性;property函数会返回属性的值。


//信号和槽:
最后一个参数:Qt::ConnectionType表示了信号与槽槽之间的关联方式
Qt::AutoConnection(缺省值):自动确定关联方式。
Qt::DirectConnection:信号被发射时,槽立即执行,槽函数与信号在同一线程
Qt::QueuedConnection:事件循环回到接收者线程后执行槽,槽与信号在不同线程
Qt::BlockingQueueConnection:与Qt::QueuedConnection相似,信号线程会被阻塞直到槽执行完毕。当槽函数与信号在同一线程,会造成死锁。
//disconnect()函数的使用
1. 解除与一个sender所有signal的连接:
disconnect(myObject,nullptr,nullptr,nullptr);//静态函数
myObject->disconnect();      
2. 解除与一个特定信号的所有连接:
disconnect(myObject, SIGNAL(mySignal()), nullptr, nullptr); 
myObject->disconnect(SIGNAL(mySignal()));
3. 解除与一个特定receiver的所有连接:
 disconnect(myObject, nullptr, myReceiver, nullptr);
4. 解除一对特定的信号和槽的连接:
 myObject->disconnect(myReceiver);
disconnect(lineEdit, &QLineEdit::textChanged,label, &QLabel::setText);
//(sender)函数     
在槽函数里,使用QObject::sender()可以获取信号发射者的指针
QSpinBox * spinbox = qobject_cast<QSpinBox *>(sender());


//QVariant
各种属性的数据类型不同,需要使用QVariant类表示可以存储任何类型的数据。
QVariant var(173); 
QString str=var.toString();     //str="173"
int val=var.value<int>();       //val=173

QStringList strList;
strList<<"one"<<"two"<<"three";
var.setValue(strList);                  //给var赋值一个字符串列表
QStringList value=var.toStringList();   //转换为字符串列表

QFont font=this->font();        //窗口的字体
QVariant var=font;              //赋值给一个QVariant变量
QFont font2=var.value<QFont>(); //转换为QFont类型

//QRandomGenerator
QRandomGenerator *rand1=new QRandomGenerator(QDataTime::currentMSecsSinceEpoch());
QRandomGenerator *rand2=new QRandomGenerator(QDataTime::currentMSecsSinceEpoch());
for(int i=0;i<5;i++)
    qDebug("R1=%u,R2=%u",rand1->generate(),rand2->generate());

QRandomGenerator rand(QDateTime::currentSecsSinceEpoch());
for(int i=0;i<5;i++)
    qDebug("number=%u",rand());//rand()等同于rand.generate()

QList<quint32> list;
list.resize(16);
QRandomGenerator::global()->fillRange(list.data(), list.size());

quint32 array[10];
QRandomGenerator::global()->fillRange(array);//生成随机数并填充数组

double QRandomGenerator::bounded(double highest)
quint32 QRandomGenerator::bounded(quint32 highest)
quint32 QRandomGenerator::bounded(quint32 lowest, quint32 highest)
int QRandomGenerator::bounded(int highest)
int QRandomGenerator::bounded(int lowest, int highest)
quint64 QRandomGenerator::bounded(quint64 highest)

要获得[60,101)之间的值,可以这样写:
quint32 v = QRandomGenerator::global()->bounded(60, 101);



1. 日期时间:QTimeEdit,QDateEdit,QDateTimeEdit、QCalendarWidget。

2. QTimer是软件定时器,QTimer的主要功能是设置一个以毫秒为单位的定时周期,然后进行连续定时或单次定时。
QTimer::singleShot静态函数,可以方便的调用一次slot函数
QElapsedTimer用于快速计算两个事件之间的间隔时间,是软件计时器。

enum Qt::TimerType,有3个值:
Qt::PreciseTimer:value为0,精度保持在毫秒级别
Qt::CoarseTimer:value为1,精度保持在所需间隔的5%以内
Qt::VeryCoarseTimer:value为2,非常粗糙的定时器,精度保持在秒级

3. QComboBox是下拉列表框组件,它提供一个下拉列表供用户选择输入,也可以提供一个编辑框用于输入文字。ComboBox下拉列表的每个项(item)还可以存储一个或多个QVariant类型的用户数据,用户数据并不显示在界面上。

4. QListWidget是显示的列表组件,列表的每个项是一个QListWidgetItem对象,一个项存储了文字、图标、用户数据等内容。

5. QToolButton类
setDefaultAction()函数,可以与Action关联。
通过popupMode属性描述如何弹出菜单。
enum ToolButtonPopupMode { DelayedPopup, MenuButtonPopup, InstantPopup }

6. Qt 中用于项(Item)处理的组件有两类:
Item Views:包括 QListView、QTreeView、 QTableView、QColumnView 等;(父类)
Item Widgets:包括 QListWidget、QTreeWidget 和 QTable Widget;(子类)
7. QTreeWidget是一种Item Widget组件,即树形组件,它的项(item)被称为节点。树形组件适合于显示具有层级结构的数据。

8. QTableWidget是一种Item Widget组件,它以表格形式显示和管理数据。表格的每个单元格关联一个QTableWidgetItem对象,可以设置每个单元格的文字内容、字体、文字颜色、背景色、图标等,还可以有复选框。每个单元格还可以存储用户数据。

9. QSlider和QProgressBar
QProgressBar的format属性类型为QString,其中占位符含义如下:
%p ,完成的百分比
%v ,当前值
%m,总步数
默认值为“%p%”。

代码参考:

知识点:
1. ui_widget.h:类的名称是Ui_widget.h,根据组件、信号与信号槽自动生成。
2. 数学运算函数在 <QtMath> 头文件中定义
3. 消息显示: qDebug,qWarning、qCritical、qFatal、qInfo 
4. 全局宏:QT_VERSION、QT_VERSION_STR、
5. 容器:QList、QStack和QQueue;QMap、QMultiMap、QHash、QMultiHash和QSet。
6. QGridLayout类添加组件的函数是addWidget():
7. QAbstractButton的autoExclusive属性:如果启用了自动独占性,属于同一个父部件的可检查按钮将互斥。
8. QGroupBox的flat属性:可以最小化区域框的空间消耗。在大多数样式中,启用这个属性会移除框架的左边缘、右边缘和底边。



代码:
1. main.cpp
QPushButton* btn = new QPushButton("zhouyi",&w);
2. 一个信号可以连接多个槽函数
ui->setupUi(this);
connect(ui->radioBlack,SIGNAL(clicked()),this,SLOT(do_setFontColor()));
connect(ui->radioBlue,SIGNAL(clicked()),this,SLOT(do_setFontColor()));
connect(ui->radioRed,SIGNAL(clicked()),this,SLOT(do_setFontColor()));
3. Q_UNUSED(name)//这个宏用于在函数中定义不在函数体里使用的参数
void MainWindow::on_imageSaved(int id, const QString &fileName) 
{ 
Q_UNUSED(id); 
LabInfo->setText ("图片保存为:"+ fileName); 
}
4. 布局分布管理 stretch
layoutStretch:0,0,0,表示3个组件平均分配宽度
layoutStretch:0,0,1,表示前两个组件达到合适宽度后不再增加宽度,其余的空间都分配给第三个组件
layoutStretch:1,1,2,表示前两个组件达到合适宽度后将尽量满足1:1:2的比例
5. 分割条允许用户通过拖动子widget之间的边界来控制子widget的大小。
QSplitter *splitter = new QSplitter(parent);
QListView *listview = new QListView;
QTreeView *treeview = new QTreeView;
QTextEdit *textedit = new QTextEdit;
splitter->addWidget(listview);
splitter->addWidget(treeview);
splitter->addWidget(textedit);
//splitter->setOrientation(Qt::Vertical);





999. QMetaObject类
int main(int argc, char *argv[]){
    QApplication a(argc, argv);
    //QObject::metaObject返回类关联的元对象
    QObject *btn = new QPushButton;
    qDebug()<<btn->metaObject()->className(); //返回“QPushButton”
    QPushButton *btnPush=qobject_cast<QPushButton*>(btn);//qobject_cast类似于标准C++中的dynamic_cast
    qDebug()<<btnPush->metaObject()->className();
    QTimer *timer = new QTimer();               //QTimer是QObject的子类
    qDebug()<<timer->inherits("QTimer");        //返回true
    qDebug()<<timer->inherits("QObject");       //返回true
    qDebug()<<timer->inherits("QAbstrctButton");//返回false
    //superClass返回父类的元对象
    qDebug()<<btn->metaObject()->superClass()->className();
}
1000:属性系统:
Q_PROPERTY(bool focus READ hasFocus) 
Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled) 
Q_PROPERTY(QCursor cursor READ cursor WRITE SetCursor RESET unsetCursor) 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QPushButton *button = new QPushButton;
    QObject *object = button;
    bool isFlat = object->property("flateee").toBool();
    qDebug()<<isFlat;
    object->setProperty("flateee",true);
    isFlat = object->property("flateee").toBool();
    qDebug()<<isFlat;
    const QMetaObject *meta=object->metaObject();
    int index=meta->indexOfProperty("down");
    QMetaProperty prop=meta->property(index);
    bool res=prop.isWritable();
    qDebug()<<" down(QPushButton) isWritable?: "<<res;
}
1001:类的附加信息
Q_OBJECT 
Q_CLASSINFO("author","Wang") 
Q_CLASSINFO("compay","UPC")
Q_CLASSINFO("version","3.0.1")

QMyWidget * myWidget = new QMyWidget;
qDebug()<<myWidget->metaObject()->classInfo(0).name();
qDebug()<<myWidget->metaObject()->classInfo(0).value(); 
qDebug()<<myWidget->metaObject()->classInfo(1).name(); 
qDebug()<<myWidget->metaObject()->classInfo(1).value();
1002. 自定义信号及其使用:
class QPerson:public QObject 
{ 
Q_OBJECT 
private: 
int m_age = 10; 
public: 
void incAge(); 
signals: 
void ageChanged(int value); 
}; 
void QPerson::incAge() { m_age++; emit ageChanged(m_age); //发射信号 
1003:容器:
QList<float> list; //定义一个float类型的数据列表
QList<int> list={1,2,3,4,5};//初始化列表数据
QList<int> list(100); //初始化列表元素个数为100,所有元素默认为0
QList<QString> strList(10,"pass");//10个元素,每个元素都被初始化为pass
QList<QString> list;
list<<"Monday"<<"Tuesday"<<"Wednesday"<<"Thursday";
list.append("Friday");
QString str1=list[0];        	//QList::const_reference QList::operator[](qsizetype i) const
QString str2=list.at(1);  
//------------
QMap<QString, int> map;
map["one"] = 1;
map["three"] = 3;
map["seven"] = 7
map.insert("twelve", 12);
int num1 = map["one"];
//如果在map中没有指定键的项,这些函数返回一个默认构造的值。
int num2 = map["thirteen"];
int num3 = map.value("thirteen");
//还有一个value()重载方法,如果指定的键不存在,则使用第二个参数作为默认值
 int num4 = map.value("thirteen",13);
5. foreach
QList<QString> values;
foreach (QString str, values)
    qDebug() << str;


到了这里,关于C++系列三:QT初识2的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA学习实践之旅——前言及目录

    很早就有在博客中记录技术细节,分享一些自己体会的想法,拖着拖着也就到了现在。毕业至今已经半年有余,随着项目越来越深入,感觉可以慢慢进行总结工作了。趁着2024伊始,就先开个头吧,这篇博客暂时作为汇总篇,记录在这几个月以及之后从FPGA初学者到也算有一定

    2024年02月03日
    浏览(55)
  • 07-3_Qt 5.9 C++开发指南_文件目录操作

    Qt 为文件和目录操作提供了一些类,利用这些类可以方便地实现一些操作。Qt 提供的与文件和目录操作相关的类包括以下几个。 QCoreApplication:用于提取应用程序路径、程序名等文件信息 QFile: 除了打开文件操作外,QFile 还有复制文件、删除文件等功能 QFileInfo:用于提取文件的信

    2024年02月13日
    浏览(51)
  • 跟小德学C++之代码目录

    嗨,大家好,我是出生在达纳苏斯的一名德鲁伊,我是要立志成为海贼王,啊不,是立志成为科学家的德鲁伊。最近,我发现我们所处的世界是一个虚拟的世界,并由此开始,我展开了对我们这个世界本源的探索。那么就由我来带领大家拨开迷雾,深入探究我们世界的根本。

    2024年02月04日
    浏览(16)
  • 【C++】C++学习前言

    C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(objectoriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。

    2024年03月12日
    浏览(54)
  • 华为OD机试真题目录汇总 C++ 代码解答版

    本文是2024华为OD机试真题(C语言)专栏的目录贴(持续更新中…) 专栏介绍: 定期更新华为OD各个时间阶段的机试真题,每日定时更新,本专栏将使用C语言进行更新解答,包含真题,思路分析,代码参考,欢迎大家订阅学习 🔥2024华为OD机试真题(C C++ Java Py JS) B+C+D卷🔥 🔥20

    2023年04月26日
    浏览(40)
  • 从零开始学Spring Boot系列-前言

    在数字化和信息化的时代,Java作为一种成熟、稳定且广泛应用的编程语言,已经成为构建企业级应用的首选。而在Java生态系统中,Spring框架无疑是其中最为耀眼的一颗明星。它提供了全面的编程和配置模型,用于构建企业级应用。随着Spring Boot的出现,这一框架变得更加易于

    2024年02月22日
    浏览(56)
  • 【华为OD机试真题 C++语言】101、二进制差异数 | 机试真题+思路参考+代码解析

    🍂个人博客首页: KJ.JK   🍂专栏介绍: 华为OD机试真题汇总,定期更新华为OD各个时间阶段的机试真题,每日定时更新,本专栏将使用C++语言进行更新解答,包含真题,思路分析,代码参考,欢迎大家订阅学习 🎃题目描述 对于任意两个正整数A和B,定义它们之间的差异值和

    2024年02月15日
    浏览(36)
  • 【华为OD机试真题 C++语言】367、矩阵元素的边界值 | 机试真题+思路参考+代码解析

    🍂个人博客首页: KJ.JK   🍂专栏介绍: 华为OD机试真题汇总,定期更新华为OD各个时间阶段的机试真题,每日定时更新,本专栏将使用C++语言进行更新解答,包含真题,思路分析,代码参考,欢迎大家订阅学习

    2024年02月02日
    浏览(69)
  • 【初阶C++】前言

    C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了 OOP(object oriented programming:面向对象)思想 ,支持面向对象的程序设计语言应运而生

    2024年02月04日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包