Qt入门笔记2
1,事件处理
(1)鼠标移动事件
void mouseMoveEvent(QMouseEvent *e);
Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog)
{
ui->setupUi(this);
setMouseTracking(true); //设置追踪鼠标事件
} void Dialog::mouseMoveEvent(QMouseEvent *e)
{
QMessageBox::information(NULL, "msg", "move");
}
(2),鼠标按下事件
void mousePressEvent(QMouseEvent *e);QMouseEvent类的button()方法可以获得发生鼠标事件的属性,例如左键、右键、中键等
void Dialog::mousePressEvent(QMouseEvent *e)
{
if (e->button() == Qt::LeftButton)
{
QMessageBox::information(NULL, "msg", "left");
} else if (e->button() == Qt::RightButton) { QMessageBox::information(NULL, "msg", "right"); }
else { QMessageBox::information(NULL, "msg", "mid"); } }
(3),键盘事件
#include <QKeyEvent>
//键盘事件处理
protected:
void keyPressEvent(QKeyEvent *event);
电脑键盘的w,s,a,d控制键盘的上下左右移动
//键盘事件处理函数
void Widget::keyPressEvent(QKeyEvent *event)
{
int x=ui->btnControlByKey->x();
int y=ui->btnControlByKey->y();
switch(event->key())
{
case Qt::Key_W:ui->btnControlByKey->move(x,y-20);break;
case Qt::Key_S:ui->btnControlByKey->move(x,y+20);break;
case Qt::Key_A:ui->btnControlByKey->move(x-20,y);break;
case Qt::Key_D:ui->btnControlByKey->move(x+20,y);break;
}
}
2,事件过滤器
Qt事件模型一个强大的功能是:QObject实例在看到它自己的事件之前,可以通过设置另外一个QObject实例先监视这些事件
Qt的事件模型中提供的事件过滤器功能使得一个QObject对象可以监视另一个QObject对象中的事件,通过在一个QObject对象中安装事件过滤器可以在事件到达该对象前捕获事件,从而起到监视该对象事件的效果。
简单说,就是拦截发送到另外对象的事件,创建一个事件过滤器包括两个步骤:
1、通过对目标对象调用installEventFilter()来注册监视对象
2、在监视对象的eventFilter()函数中处理目标对象的事件
我们需要重写eventFilter()函数。为了过滤特定组件上的事件,首先需要判断这个对象是不是我们感兴趣的组件,然后判断这个事件的类型
void QObject::installEventFilter(QObject * filterObj)
安装事件过滤器,参数filterObj可以 通过EventFilter()函数接收事件
ui->textEdit->installEventFilter(this);
ui->label->installEventFilter(this);
void QObject::removeEventFilter(QObject * obj)
解除已经安装的事件过滤器
ui->textEdit->removeEventFilter (this);
重写bool eventFilter(QObject *, QEvent *);
protected:
bool eventFilter(QObject *, QEvent *);
bool D
ialog::eventFilter(QObject *obj, QEvent *e)
{
if (obj == ui->label)
{ if (e->type() == QEvent::MouseButtonPress) {QMessageBox::information(NULL, "filter", "lable");
return true;
}
} return QDialog::eventFilter(obj, e); //将事件交给上层对话框
}
3,QMediaPlayer
创建播放器
QMediaPlayer *player = new QMediaPlayer;
添加播放列表
player->setMedia(QUrl::fromLocalFile("E:/qt
project/event/123.mp3"));
或者
QMediaPlaylist *list = new QMediaPlaylist;
list->addMedia(QUrl::fromLocalFile("E:/qt project/event/123.mp3"));
list->addMedia(QUrl::fromLocalFile("E:/qt project/event/456.mp3"));
player->setPlaylist(list);
设置音量
player->setVolume(1000);
开始播放
void QMediaPlayer::play() [slot]
停止播放
void QMediaPlayer::stop() [slot]
暂停播放
void QMediaPlayer::pause() [slot]
信号、槽机制
快进或者倒退播放
connect(ui->horizontalSlider, SIGNAL(sliderMoved(int)), this, SLOT(setPosition(int)));
设置slider进度条随着播放进度移动
connect(player, SIGNAL(positionChanged(qint64)), this, SLOT(positionChanged(qint64)));
4,线程的创建
Qthread
创建
QThread *thread = new QThread();
启动线程
thread->start(),当start函数被调用,线程的run函数被自动调用,run函数时整个线程的入口函数,一般需要重写,将需要处理的任务在run函数中实现
void run();
终止线程
void QThread::exit(int returnCode = 0)
void QThread::terminate();
等待线程结束
bool QThread::wait(unsigned long time = ULONG_MAX)
void Dialog::on_pushButton_2_clicked()
{
thread1->terminate();
thread1->wait();
}
示例代码片段
class mythread : public QThread
{
Q_OBJECT
protected: void run();
signals:
void update_thread1();
};
oid mythread::run()
{
while (1)
{
emit update_thread1();
sleep(2);
}
}
5,线程同步
mutex互斥量
定义互斥量
Qmutex mutex;
lock()方法加锁
void QMutex::lock()
unlock()方法解锁
void QMutex::unlock()
QSemaphore信号量
定义信号量
QSemaphore sem(num);
获取信号量
sem.acquire();
释放信号量
sem.release()
6,查询QT支持哪些数据库
为了能使用 SQLITE 我们必须在 QT 工程中的 .pro 文件中加入:
QT += sql
通过 QSqlDatabase::drivers() 方法来获取当前的 sql 模块中支持哪些数据库
qDebug() << QSqlDatabase::drivers() << endl;
创建数据库
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("mytest.db");
if (!db.open()) {
qDebug() << "Database Error!";
}
将在qt工程的DEBUG目录下创建数据库mytest.db
使用sql语句
在 QT 中我们通过一个QSqlQuery实例执行 SQL 语句:
QSqlQuery query;
创建表格:
创建一个名叫 student 的表,包含三列 id , name , age
QSqlQuery query;
if (!query.exec("CREATE TABLE student ("
"id INTEGER PRIMARY KEY AUTOINCREMENT,"
"name VARCHAR,"
"age INT)"))
{
qDebug() << "Create Table Failed!"; //如果该项存在的化就不会重新创建
}
插入条目
if(!query.exec("INSERT INTO student (name, age) VALUES (\"TOM\", 10)"))
{ qDebug() << "INSERT Failed!"; }
查找
query.exec("select * from student");
while (query.next()){
int index = query.value(0).toInt();
QString name = query.value(1).toString();
int age = query.value(2).toInt();
qDebug() << index << ":" << name << ":" << age << endl;
}
修改
query.exec("update student set name=\"aaa\" where age=10");
删除
query.exec("delete from student where age=10");
博文索引 持续更新中。。。