自学qt之 事件

QODBC 在微软下
QMTSQL 在linux

事件触发导致了 信号的产生
事件时比较底层的概念
信号和槽是qt自己对应用程序管理的概念

protected:
void ketPressevent

event->ignore(0;//忽略掉事件信号 那么这个信号会让父对象来处理
if(event->key()=Qt::key_m)

void mylineed:keyPressEvent(QKeyEvent *event)
键盘按下,单击事件,滚轮事件

找一个空间,然后设置布局,然后删除按钮
在构造函数里写东西
{ myButton=new Mybutton;
myButton->setText(tr(“hello”));
ui->horizontalLayout->addWidget(myBUtton);
connect(myButton,SIGNAL(clicked()),this,SLOT(myBUttonClick()));
}
private slots:
void myButtonClicked();

void Dialog::myButtonClick()
{
QMessageBox:information(this,tr(“test”));

}

//pushButton里面有很多事件,他们都是受保护的虚函数  重写虚函数
#include <QPushButton>
class Mybutton:public QPushButton
{
protected:

}
void MyButton::keyPressEvent(QKeyEvent *)
{
  QMessageBox::information(this,tr("test"));
}

按钮信号 clicked()
键盘按下—-keyPressEvent
键盘松开—-keyReleaseEvent
鼠标按下—-mousePressEvent

鼠标松开—–mouseReleaseEvent
窗口显示—–paintEvent
定时器——–timerEvent

protected:
void mousePressEvent(QMouseEvent *e);
void mouseMoveEvent(QMouseEvent *e);
void mouseReleaseEvent(QMouseEvent *e);
void mouseDoubleClickEvent(QMouseEvent *e);

void MyWidget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
QPixmap pix;
oix.load(“文件路径”);
painter.drawPixmap(pix);
}


事件处理方法:
1.重新实现事件处理器
2.重新实现QObject::event()
3.在QObject中安装事件过滤器
4.在QAppliction对象中安装事件过滤器
5.子类话QAppliction并且重新实现notify()
事件处理 :
事件处理链
当前对象–>父对象–>
事件的接收与忽略
accept()
ignore()
//构造函数里
在MainWindow::MainWindow(QWidget *parent):QMainWindow(parent)
{
QTabWidget *tabWidget=new QTabWidget;//选项卡
QWidget *firstTab,*seconed;
firstTab=new QWidget;
seconed=new QWidget;
QGroupBox *groupBox=new QGroupBox(tr(“Demo Group”),firstTab);//指定父对象
groupBox->serGeometry(100,100,300,200);//设置大小
QCheckBox *checkBox=new QCheckBox(tr(“Demo checkBox”),groupBox);//指定父对象
checkBox->setGeometry();//设置的大小
tabWidget->addTab(firstTab,tr(“First Tab”))
tabWidget->addTab(seconed,tr(“Seconed Tab”));
this->setCentralWidget(tabWidget);//作为中央窗口部件
}
//只有继承了才可以重写事件处理函数
classs MyTabWidget:public QTabWidget//继承选项卡
{

}
class MyTab:public QWidget
{
}
class MyGroupBox :public QGroupBox
{
public :
explicit MyGroupBox(const QString &title,QWidget *parent=0):QGroupBox(title ,parent){}
protected:
void mousePressEvent(QMouseEvent *event)
{
QMessageBox::information(this,tr(“test”,tr()));
event->ignore();//忽略事件会转向父对象来进行处理
event->accept();不会传到父对象
}
}
//主窗口的关闭事件
class MainWindow:public QMainWindow
{
private:
bool continueToClose()
{
if(QMessageBox::question(this,tr(“Quit”),
tr(”Are you sure “),
QMessageBox::Yes|QMessageBox::NO,
QMessageBox::NO)=QMessageBox::Yes)//默认的是NO
{
return true;
}
else
{
return false;
}
}

protected:
void closeEvent(QCloseEvent *event)
{
if(continueToclose())
{
event->accept();
}
else
{
event->ignore();
}
}
}


事件过滤器
——-事件—-过滤器—–PushButton
使用installEventFilter()安装事件过滤器
事件过滤器的eventFilter()函数

 //QlineEdit
 实现功能::敲空格来转换光标位置  
 //在构造函数里 
 Dialog里面有事件过滤器的函数的
 Dialog::Dialog(QWidget *parent):
 {
 ui->nameLineEdit->installEventFilter(this);
 ui->IDLineEdit->installEventFilter(this);
 ui->phoneNumberLineEdit->installEventFilter(this);

 }
 bool Dialog::eventFilter(QObject *target QEvent *event)
if(target==ui->nameLineEdit||traget==IDLineEdit||target==ui->phoneNUmberLineEdit)
   {
       if(event->type()==QEVent::KeyPress)
       {
        QKEyEvent *keyEvent=(QKeyEvent *)event;
        if(KeyEvent->key()==Qt::Key_Space)
        {
          focusNextChild();//焦点到下一个
          return true;
        }
       }
   }
   return QDialog::eventFilter(target,event);//继承下来的,可能有很多功能 ,这样可以只改变该该改变的功能 
 }

可以安装多个过滤器
一个对象可以安装多个过滤器
先执行最后安装的过滤器

QApplication的事件过滤器
QApplication:exec() –事件队列 –分派 –pushbutton
两种QPushButton::event()
keyPressEvent()
KeyReleaseEvent()
mousePressEvent()………..
还有QMainWindow::event()
keyPressEvent()
KeyReleaseEvent()
mousePressEvent()…..
会对所有的执行过滤器
class Demofilter
{
eventfilter();
}
a.installEventFilter(new DemoFilter())

class MyApplication:public QApplication
{
bool notify(QObject ,QEVent );
{
}
}


重新实现QObject::event()
QPushButton::event()
重新实现event()
**在事件到达特定的事件处理器之前进行处理
** 使用情形
覆盖Tab键的默认功能
没有特定事件处理器的 事件
自定义事件
bool QWidget::event(QEvent *event)
{
switch(e->type())
{
case:QEvent::keyPress:
keyPressEvent((QKeyEvent*)event);
if(!(QKeyEvent *)event)->isAccepted())
retrun false;
break;
case:QEvent::KeyReleasse:
KeyReleaseEvent((QKeyEvent *)event);
……..
}

}
protected:
bool event(QEvent *e);
bool MyTextEdit::event(QEvent *e)
{
if(e->type()==QEvent::keyPress)
{
QkeyEvent keyEvent=(QkeyEvent )e;
if(KeyEvent->key()==Qt::Key_Tab)
{
return false;
}
}

retrun QTextEdit::event(e);
}


定时器事件
timerEvent()
startTimer(),killTimer()

private slots;
void beginTimer()
void endTimer()
protected:
void timerEvent(QTimerEvent *);
void paintEvent(QPaintEvent *);

void Widget::paintEvent(QPainEvent *)
{
QPainter painter(this);
painter.drawText(100,50,QString::number(count));//把数子变成字符串显示
}

void Widget::timeEvent (QTimeEvent *)
{
if(event->timerId())
count++;
update();
}
void Widget::beginTimer()
{
myTimerID= startTimer(500);
yourTimerId=startTimer(2000);
}

killTimer(myTimerId)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值