QT5总结

本文详细介绍了Qt编程中的事件循环、信号槽机制、UI绘制、线程管理、网络通信、多媒体处理、数据库操作以及MVC模式和模型视图的实践。重点讲解了如何使用QApplication、信号槽连接、自定义控件和网络通信功能。
摘要由CSDN通过智能技术生成

入口
QApplication a(argc, argv);

事件循环,等待用户操作和系统的消息
a.exec();

加载ui文件
ui->setupUi(this);

信号槽
Q_OBJECT
只有继承了QObject类的类,才具有信号槽的能力。

自定义信号
signals:
void mySignal(int value);
发射信号
emit mySignal(100);

public slots:
void mySlot(); // 声明一个无参数的槽

连接信号和槽:connect
QObject::connect(obj1,SIGNAL(mySignal()),obj2,SLOT(mySlot()));
QObject::connect(obj1, &MyObject::mySignal, obj2, &MyObject::mySlot);
QObject::connect(obj1, &MyObject::mySignal, obj2, ={});
SIGNAL和SLOT两个宏,实际是将其参数转换成相应的字符串。

五种连接方式
enum ConnectionType {
AutoConnection, 发送和接收在同一线程,使用DirectConnection;不在同一线程,使用QueuedConnection
DirectConnection, 直接执行槽函数(emit信号后,等槽函数执行完才往下)
QueuedConnection, 放入消息队列(emit信号后,往下运行)
BlockingQueuedConnection, 同QueuedConnection,但阻塞,直到槽函数运行完(发送接收必须不同线程,否则死锁)
UniqueConnection = 0x80 不会重复连接
};
同一个信号和槽可以连接多次,这会造成:发一次信号,多次执行槽函数
可以用connect实现信号触发信号

signals,slots,标记出信号和槽。
connect连接时,将信号槽的索引信息放到一个map中,彼此配对。
当调用emit时,调用信号函数,并且传递发送信号的对象指针,元对象指针,信号索引,参数列表到active函数
通过active函数找到在map中找到所有与信号对应的槽索引
根据槽索引找到槽函数,执行槽函数

窗口绘画流程

绘制
void paintEvent(QPaintEvent *) {
QPainter painter(this);
painter.setPen(Qt::blue);
painter.setBrush(Qt::red);
}

界面刷新
void update()

事件
事件循环:QApplicaion::exec()、QMessageBox::exec()。终止事件循环QEventLoop::quit()
事件过滤:QObject::eventFilter()
注册事件过滤器:QObject::installEventFilter()
鼠标事件:QMouseEvent,mousePressEvent(QMouseEvent *e),mouseMoveEvent(QMouseEvent *e)
键盘事件:QKeyEvent,keyPressEvent

事件传递优先级
全局事件过滤器:QApplication::EventFiletr
对象事件过滤器:QObject::eventFilter()
QWidget::event(QEvent *event)
具体事件处理函数:QMouseEvent,QKeyEvent

控件:
QPushButton
QRadioButton
QToolButton
QCheckBox
QSpinBox
QLabel
QImage
QProgressBar
QMenu
QAction
QTableWidget
QListView
QListWidget
QDialog
QFileDialog
QPrinter

自定义控件
1.继承QWidget
2.重写paintEvent(QPaintEvent *e)
3.QPainter
4.QPoint center(width()/2, height()/2);获取中心点
5.绘制
translate
setPen
setBrush
drawEllipse
drawLine
drawPolygon
drawRoundRect
drawText
rotate
restore
QFontMetrics
QPonit
QRect
QPonitF
QRectF

定时器
QTimer

布局
水平布局:QHBoxLayout
垂直布局:QVBoxLayout
网格布局:QGridLayout:跨行,跨列
流式布局:QFlowLayout
对齐方式:Qt::AlignCenter
动态加载控件:layout->insertWidget(0, new QPushButton);

对话框
QInputDialog
QMessageBox

线程
1.继承QThread,重写虚函数void run(),start()启动
2.继承QRunnable,并重写虚函数void run(),QthreadPool启动
QThreadPool::globalInstance()->start(&myRunnable);
3.创建一个QThread对象,将对象移动到QThread对象中
myObject->moveToThread(myThread);

线程更新UI
1.子线程用信号把数据发到UI线程
2.继承QEvent,重写run方法,使用postEvent
QApplication::postEvent(qApp, new UpdateUIEvent());

class UpdateUIEvent : public QEvent {
void run() {
// Do some work
QMetaObject::invokeMethod(this, “updateUI”, Qt::QueuedConnection);
}
};

网络
QT += network

TCP
TCP客户端:QTcpSocket
连接服务器:connectToHost
连接成功:触发信号connected
断开连接:触发信号disconnected

TCP服务端:QTcpServer
监听:listen
客户端发起连接:触发信号newConnection
获取客户端:nextPendingConnection,peerAddress,peerPort

UDP:QUdpSocket
HTTP:QNetworkRequest/QNetworkAccessManager

多媒体
QT += multimedia
QT += multimediawidgets

音频播放器:QMediaPlayer
播放列表:QMediaPlaylist
播放视频:QVideoWidget

数据库
驱动:QSqlDatabase::addDatabase(QMYSQL);,addDatabaseName,setHostName,setUserName,setPassword
打开:open
SQL语句:QSqlQuery
执行:query.exec(sql); query.next(); query.value(0);

图表 QChart
折线图:QLineSeries
柱状图:QStackedBarSeries
饼图:QPieSeries

MVC
model:提供数据
view:显示
controller:业务逻辑,发信号给view以更新界面

模型视图
数据模型:提供数据,QStandardItemModel,QAbstractItemModel,QQueryModel
委托:Delegate 自定义样式、大小、显示内容

1.创建model,model添加数据(QStandardItemModel里面包含很多QStandardItem,model->setItem)
2.view设置model:setModel
3.信号槽实现交互
QItemSelectionModel
setSelectionModel
触发currentChanged

QModelIndexList selectedIndex=selection->selectedIndexes();
for (int i=0; i<selectedIndex.count(); i++)
{
QModelIndex Index=selectedIndex.at(i);
QStandardItem *Item=model->itemFromIndex(Index);
}

QList<QStandardItem*> ItemList; // QStandardItem的列表类
for(int i=0;i<FixedColumnCount-1;i++)
{
QStandardItem *Item= new QStandardItem(“测试(插入行)”); // 新建一个QStandardItem
ItemList << Item; // 添加到列表类
}

QModelIndex curIndex=selection->currentIndex(); // 获取当前选中项的索引
model->insertRow(curIndex.row(),ItemList); // 在当前行的前面插入一行

QModelIndex curIndex = selection->currentIndex(); // 获取当前选择单元格的模型索引
model->removeRow(curIndex.row()); //删除最后一行

自定义项
QStandardItem只保存数据,如果要添加button/label/image需要delegate
1.继承QItemDelegate
2.重写paint方法
3.tableView.setItemDelegateForColumn(0, &buttonDelegate); // 为第一列设置delegate

添加文字可以用setItem,添加控件就得用setCellWidget了。

样式文件
指定某个控件:#slidpreBtn,#slidenextBtn,#playBtn 根据setObjectName设置的ObjectName
指定某类控件:QTreeView
指定某类控件子控件:QTreeView::item:hover
不同状态:#preListWidget::item:selected
属性:
color: red;
background: rgb(38, 95, 153);
border-color: #FFFFFF;
border-style: solid;
border-width: 1px 1px 1px 1px;
border: 1px solid #FFFFFF;
margin-left:10px;

QML
控件:Window,Rectangle,Image,Text,MouoseArea,ListView,ListModel,ListElement
属性:id,width,height,visiable,x,y,color,font,border
事件:onClicked,onTextChanged,Keys.onSpacepressed
动画:NumberAnimation,PropertyAnimation,SequentialAnimation
方法:JavaScript
C++调QML的对象:find,再设置属性
QML调C++:将对象注册到上下文

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值