"Eventos de mouse no Qt"
O evento abreviado como QEvent
faz alguma construção, destruição e captura para alguns controles. Em seguida, você precisa fazer alguns controles personalizados com base nos controles existentes.
Evento de entrada do mouse: enterEvent (evento QEvent *);
evento de saída do mouse: leaveEvent (evento QEvent *);
palavra-chave virtual, o que significa que a função de membro pode ser substituída na subclasse.
Casos de uso:
PS: Arraste e solte o tipo de controle Label na interface da IU, clique com o botão direito em " Promover para ... " tipo personalizado myLabel
/*
自定义空间类
实现鼠标进入/离开事件的捕捉。
*/
class myLabel : public QLabel
{
Q_OBJECT
public:
explicit myLabel(QWidget *parent = nullptr);
/* 重写进入和离开事件 */
void enterEvent(QEvent *event);
void leaveEvent(QEvent *event);
signals:
public slots:
};
myLabel::myLabel(QWidget *parent) : QLabel(parent)
{
}
void myLabel::enterEvent(QEvent *event) {
qDebug()<<"鼠标进入...";
}
void myLabel::leaveEvent(QEvent *event) {
qDebug()<<"鼠标离开...";
}
Funções protegidas reimplementadas
Também existem funções-membro disponíveis para reimplementação na classe QLabel, conforme mostrado na tabela a seguir
Mouse para baixo: mousePressEvent (QMouseEvent * EV)
movimento do mouse:. MouseMoveEvent (QMouseEvent * EV)
Mouse para cima: mouseReleaseEvent (EV QMouseEvent *)
Código
class myLabel : public QLabel
{
Q_OBJECT
public:
explicit myLabel(QWidget *parent = nullptr);
/* 鼠标的进入/离开事件 */
void enterEvent(QEvent *event);
void leaveEvent(QEvent *event);
/* 鼠标的移动、按下、释放 事件 */
virtual void mouseMoveEvent(QMouseEvent *ev);
virtual void mousePressEvent(QMouseEvent *ev);
virtual void mouseReleaseEvent(QMouseEvent *ev);
signals:
public slots:
};
myLabel::myLabel(QWidget *parent) : QLabel(parent)
{
// 设置鼠标追踪 默认为false
// 鼠标不需要按下,即可打印坐标
setMouseTracking(true);
}
void myLabel::enterEvent(QEvent *event) {
qDebug()<<"鼠标进入...";
}
void myLabel::leaveEvent(QEvent *event) {
qDebug()<<"鼠标离开...";
}
void myLabel::mouseMoveEvent(QMouseEvent *ev) {
/* 参数:QMouseEvent *ev
能捕获到所有鼠标按下、点击、释放等信息。详情可查表
*/
// Qt中的格式化字符串
if (ev->buttons() & Qt::LeftButton) {
QString str = QString("鼠标移动 x=%1, y=%2 ").arg(ev->x()).arg(ev->y());
qDebug()<<str;
}
}
void myLabel::mousePressEvent(QMouseEvent *ev) {
// 鼠标左键按下(状态判断用&)
if (ev->button() == Qt::LeftButton) {
QString str = QString("鼠标按下 x=%1, y=%2 ").arg(ev->x()).arg(ev->y());
qDebug()<<str;
}
}
void myLabel::mouseReleaseEvent(QMouseEvent *ev) {
QString str = QString("鼠标释放 x=%1, y=%2 ").arg(ev->x()).arg(ev->y());
qDebug()<<str;
}
"Timer 1-Event"
Evento de cronômetro: timerEvent
Passos para iniciar o evento temporizador:
- Reescrever o evento timerEvent (QTimerEvent * e)
- Inicie o cronômetro startTimer (1000)
Atualização de amostra:
Requisitos: +1 a cada 2 segundos.
Observe que na linha 19 da parte superior do tórax, a classe QTimerEvent tem uma função de membro timeId na classe, que representa o ID do temporizador passado pelo temporizador externo
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
// 重写定时器事件
void timerEvent(QTimerEvent *e);
// 定时器ID
int id1;
int id2;
private:
Ui::Widget *ui;
};
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
// 启动定时器
id1 = startTimer(1000); //参数1 间隔 单位 毫秒
id2 = startTimer(2000);
}
Widget::~Widget()
{
delete ui;
}
void Widget::timerEvent(QTimerEvent *e) {
if (e->timerId() == id1) {
static int num = 1;
// label 每个1秒+1
ui->label->setText(QString::number(num++));
}
if (e->timerId() == id2) {
static int num = 1;
// label_2 每隔2秒+1
ui->label_2->setText(QString::number(num++));
}
}
"Timer 2-Class"
- Use a classe de cronômetro QTimer
- Criar objeto timer QTimer * timer = new QTimer (this)
- Inicie o cronômetro -> iniciar ();
- A cada certo milissegundo, envie um sinal (tempo limite) para monitorar
- Pause o cronômetro -> parar ();
Compare o evento temporizador. O objeto do tipo timer possui uma única função, ou seja, um timer é responsável pelo início e parada de uma função.
Para eventos do temporizador, todos os eventos de resposta do temporizador são colocados na função de acionamento do temporizador timerEvent (QTimerEvent * e).
Teste a castanha:
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
// 定时器第二种方式
QTimer *timer = new QTimer(this);
// 启动定时器
timer->start(500);// 每隔0.5秒,定时器对象发出一个信号出来.
connect(timer, &QTimer::timeout, [=](){
static int num = 1;
// label 每隔0.5秒+1
ui->label->setText(QString::number(num++));
});
// 点击暂停按钮,实现停止定时器
connect(ui->btnStop, &QPushButton::clicked, [=](){
timer->stop();
});
}