Qt学习
-
-
- 学习中的错误
- 常用快捷键
- 杂项
- 布局
- 信号与槽
- 数据库相关
- QSS
- 事件
- QThread:线程
- 线程通信 -- QMutex:互斥锁
- 线程通信 -- QSemaphore:信号量
- 网络相关
- QPixmap
- QFile:文件相关
- QFileInfo:文件信息
- QDir:目录相关
- QWidget 相关
-
- QWidget
- QPushButton: 按钮
- QLineEdit: 行编辑器
- QCheckBox: 复选框
- QRadioButton: 单选按钮
- QGroupBox: 分组框
- QLabel: 标签
- QFileDialog: 文件对话框
- QInputDialog 输入对话框
- QMessageBox 消息框
- QFontDialog 字体对话框
- QColorDialog 颜色对话框
- 自定义对话框 class myDialog : public QDialog
- QTextEdit:文本编辑器
- QListWidget:列表部件
- QComboBox:下拉条(下拉列表框、组合框)
- QStackedWidget:堆叠窗口
- QSpinBox:自旋框(整数)
- QDoubleSpinBox:数字设定框(浮点数)
- QSlider:滑动条
- QScrollBar:滚动条
- QProgressBar:进度条
- QTime:时间
- QTimeEdit:时间编辑器
- QDateTime:日期
- QDateTimeEdit:日期编辑器
- QTimer:定时器
- QMainWindow 主窗口 -- 相关
- 一些操作
-
学习中的错误
- 堆叠窗口 需要放在布局中。
- “程序异常结束”:声明了私有指针变量,直接使用(操作野指针)
常用快捷键
F1 //查看帮助,文档
F2 //快速到变量声明
F4 //在 cpp 和 h 文件切换
alt +enter //自动创建类的定义
Shift + F2 //函数的声明和定义之间快速切换
Shift+delete //剪切当前行
Ctrl + R //运行程序
Ctrl + B //Build 项目
Ctrl + / //注释当前行 或者 选中的区域
杂项
//sender() -- 谁产生信号进入的槽函数,通过转换函数转换为对应的派生类对象类型
//继承关系间的转换 static_cast OR dynamic_cast(含有虚函数)
QPushButton *pb = static_cast<QPushButton *> (sender());
str.chop(n); //去掉字符串str最后n个元素,改变了源字符串
str.indexOf('.'); //在str内查找子串
str.toLatin1(); //转为 QByteArray 类型
QString i;
QString total;
QString fileName;
//位置编号必须在 1-99之间
QString status = QString("Processing file %1 of %2: %3")
.arg(i).arg(total).arg(fileName);
布局
QHBoxLayout: 水平布局
addWidget(QWidget *) --- 添加控件
addLayout(QLayout *) --- 添加布局
/*添加一个可拉伸空间,最小尺寸为零,拉伸系数为拉伸到该框布局的末端。*/
hbox->addStretch();
QVBoxLayout:垂直布局
addWidget(QWidget *) --- 添加控件
addLayout(QLayout *) --- 添加布局
QGridLayout:栅格布局
addWidget(QWidget *, int row, int column, int rowSpin, int columnSpin);
参数:控件、行、列、行跨度、列跨度
信号与槽
1、信号与槽函数关联: connect()
一对一:
一个信号对应一个槽函数
一对多:
一个信号对应多个槽函数
多对一:
多个信号对应同一个槽函数
2、信号与信号关联:
sig1关联sig2时,当sig1产生时会自动触发sig2信号,但是sig2产生时不会触发sig1
3、解除关联:
disconnect()
4、槽函数的参数:
槽函数的参数是由信号的参数传递,因此:
槽函数的参数个数一定是小于或等于信号的参数个数
当槽函数有参数时,参数类型一定与信号对应参数类型一致
5、槽函数:
如果槽函数是自定义的:
声明需要放在slots标签之下
定义放在cpp文件中
槽函数也是类的成员函数,也可以像成员函数一样被调用
5、信号:
当自定义信号时:
类中需要加宏: Q_OBJECT
信号的声明需要放在 signals 标签之下
信号不需要定义
发射信号:emit 信号;
数据库相关
QSqlDatabase //数据库类
QSqlQuery //执行sql语句类
QSqlError //sql错误类
//Pro文件中添加 sql 模块
//添加sqlite数据库
QSqlDatabase mydb = QSqlDatebase::addDatabase("QSQLLITE");
//设置库名
mydb.setDatebaseName("user.db");
//打开数据库
if ( !mydb.open() ) //打开失败
qDebug() << mydb.lastError().text(); //输出错误信息
//执行sql语句
query = new QSqlQuery(mydb);
if ( !query->exec("create tabel if not exists user(name text, pswd text)") ) //执行语句失败
qDebug() << query->lastError().text(); //输出错误信息
QString sql = QString("insert into user values('%1', '%2 ')").arg(name, pswd);
if( !query->exec(sql) )
//对于查找语句
query->exec("select * from user");
//查找到几条记录就循环几次
while( query->next() ) //循环每一行记录
{
qDebug() << query->value(0).toString(); //输出第一列的信息
qDebug() << query->value(1).toString(); //输出第一列的信息
}
QSS
选择器 {property:value}
QPushButton,QLineEdit{
//属性不区分大小写
color:red;
background-color:white;
}
Qt样式表设置函数 setStyleSheet()
//:pressed按下时才触发
ui->pb->setStyleSheet(QString("QPushButton:pressed{
color:rgb(255, 0, 0)
}"));
QSS文本属性
事件
- 当系统的类无法满足想要的需求时,自定义类,继承系统类,重写需要的事件
//忽略该事件
event->ignore();
QMouseEvent:鼠标事件
protected:
void mousePressEvent(QMouseEvent *event); //鼠标按下事件
void mouseReleaseEvent(QMouseEvent *event); //鼠标释放事件
void mouseDoubleClickEvent(QMouseEvent *event); //鼠标双击事件
void mouseMoveEvent(QMouseEvent *event); //鼠标移动事件
//设置追踪鼠标,不按下鼠标,鼠标移动时也能触发鼠标移动事件
setMouseTracking(true);
//event->button() 获取鼠标按下的按键,判断是左键|右键|中键...
// enum Qt::MouseButton
if ( event->button() == Qt::LeftButton )
qDebug() << "Mouse leftbutton pressed!";
else if ( event->button() == Qt::RightButton )
qDebug() << "Mouse rightbutton pressed!";
else if ( event->button() == Qt::MidButton )
qDebug() << "Mouse midbutton pressed!";
else if ( event->button() == Qt::MiddleButton )
qDebug() << "Mouse middle pressed!";
//event->pos(); event->x(); event->y(); 获取鼠标按键的 相对Widget位置: x坐标 和 y坐标
qDebug() << event->pos() << event->x() << event->y();
//event->globalPos(); event->globalX(); event->globalY(); 获取鼠标按键的 相对屏幕位置: x坐标 和 y坐标
qDebug() << event->globalPos() << event->globalX() << event->globalY();