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");

博文索引  持续更新中。。。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值