Qt如何微信屏蔽分享按钮按钮事件

后使用快捷导航没有帐号?
版权声明该文章原创于Qter开源社区(),作者devbean,博客,转载请注明出处!
事件(event)是由系统或者 Qt 本身在不同的时刻发出的。当用户按下鼠标、敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件。一些事件在对用户操作做出响应时发出,如键盘事件等;另一些事件则是由系统自动发出,如计时器事件。
事件也就是我们通常说的“事件驱动(event drive)”程序设计的基础概念。事件的出现,使得程序代码不会按照原始的线性顺序执行。想想看,从最初的 C 语言开始,我们的程序就是以一种线性的顺序执行代码:这一条语句执行之后,开始执行下一条语句;这一个函数执行过后,开始执行下一个函数。这种类似“批处理”的程序设计风格显然不适合于处理复杂的用户交互。我们来想象一下用户交互的情景:我们设计了一堆功能放在界面上,用户点击了“打开文件”,于是开始执行打开文件的操作;用户点击了“保存文件”,于是开始执行保存文件的操作。我们不知道用户究竟想进行什么操作,因此也就不能预测接下来将会调用哪一个函数。如果我们设计了一个“文件另存为”的操作,如果用户不点击,这个操作将永远不会被调用。这就是所谓的“事件驱动”,我们的程序的执行顺序不再是线性的,而是由一个个事件驱动着程序继续执行。没有事件,程序将阻塞在那里,不执行任何代码。
在 Qt 中,事件的概念似乎同信号槽类似。的确如此,一般来说,使用 Qt 组件时,我们并不会把主要精力放在事件上。因为在 Qt 中,我们关心的更多的是事件关联的一个信号。比如,对于 QPushButton 的鼠标点击,我们不需要关心这个鼠标点击事件,而是关心它的 clicked() 信号的发出。这与其他的一些 GUI 框架不同:在 Swing 中,你所要关心的是 JButton 的 ActionListener 这个点击事件。由此看出,相比于其他 GUI 框架,Qt 给了我们额外的选择:信号槽。
但是,Qt 中的事件和信号槽却并不是可以相互替代的。信号由具体的对象发出,然后会马上交给由 connect() 函数连接的槽进行处理;而对于事件,Qt 使用一个事件队列对所有发出的事件进行维护,当新的事件产生时,会被追加到事件队列的尾部。前一个事件完成后,取出后面的事件进行处理。但是,必要的时候,Qt 的事件也可以不进入事件队列,而是直接处理。信号一旦发出,对应的槽函数一定会被执行。但是,事件则可以使用“事件过滤器”进行过滤,对于有些事件进行额外的处理,另外的事件则不关心。总的来说,如果我们使用组件,我们关心的是信号槽;如果我们自定义组件,我们关心的是事件。因为我们可以通过事件来改变组件的默认操作。比如,如果我们要自定义一个能够响应鼠标事件的 EventLabel,我们就需要重写 QLabel 的鼠标事件,做出我们希望的操作,有可能还得在恰当的时候发出一个类似按钮的 clicked() 信号(如果我们希望让这个 EventLabel 能够被其它组件使用)或者其它的信号。
在前面我们也曾经简单提到,Qt 程序需要在 main() 函数创建一个 QCoreApplication 对象,然后调用它的 exec() 函数。这个函数就是开始 Qt 的事件循环。在执行 exec() 函数之后,程序将进入事件循环来监听应用程序的事件。当事件发生时,Qt 将创建一个事件对象。Qt 中所有事件类都继承于 QEvent。在事件对象创建完毕后,Qt 将这个事件对象传递给 QObject 的 event() 函数。event() 函数并不直接处理事件,而是按照事件对象的类型分派给特定的事件处理函数(event handler)。关于这一点,我们会在以后的章节中详细说明。
在所有组件的父类 QWidget 中,定义了很多事件处理的回调函数,如 keyPressEvent()、keyReleaseEvent()、mouseDoubleClickEvent()、mouseMoveEvent ()、mousePressEvent()、mouseReleaseEvent() 等。这些函数都是 protected virtual 的,也就是说,我们可以在子类中重新实现这些函数。下面来看一个例子:class EventLabel : public QLabel
{
protected:
& & void mouseMoveEvent(QMouseEvent *event);
& & void mousePressEvent(QMouseEvent *event);
& & void mouseReleaseEvent(QMouseEvent *event);
};
void EventLabel::mouseMoveEvent(QMouseEvent *event)
{
& & this-&setText(QString(&&center&&h1&Move: (%1, %2)&/h1&&/center&&)
& && && && && && &.arg(QString::number(event-&x()), QString::number(event-&y())));
}
void EventLabel::mousePressEvent(QMouseEvent *event)
{
& & this-&setText(QString(&&center&&h1&Press: (%1, %2)&/h1&&/center&&)
& && && && && && &.arg(QString::number(event-&x()), QString::number(event-&y())));
}
void EventLabel::mouseReleaseEvent(QMouseEvent *event)
{
& & QS
& & msg.sprintf(&&center&&h1&Release: (%d, %d)&/h1&&/center&&,
& && && && && & event-&x(), event-&y());
& & this-&setText(msg);
}
int main(int argc, char *argv[])
{
& & QApplication a(argc, argv);
& & EventLabel *label = new EventL
& & label-&setWindowTitle(&MouseEvent Demo&);
& & label-&resize(300, 200);
& & label-&show();
& & return a.exec();
}复制代码我们编译运行上面的代码,就可以理解到有关事件的使用方法。
EventLabel 继承了 QLabel,覆盖了 mousePressEvent()、mouseMoveEvent() 和 MouseReleaseEvent() 三个函数。我们并没有添加什么功能,只是在鼠标按下(press)、鼠标移动(move)和鼠标释放(release)的时候,把当前鼠标的坐标值显示在这个 Label 上面。由于 QLabel 是支持 HTML 代码的,因此我们直接使用了 HTML 代码来格式化文字。
QString 的 arg() 函数可以自动替换掉 QString 中出现的占位符。其占位符以 % 开始,后面是占位符的位置,例如 %1,%2 这种。QString(&[%1, %2]&).arg(x, y);复制代码语句将会使用 x 替换 %1,y 替换 %2,因此,这个语句生成的 QString 为 [x, y]。
在 mouseReleaseEvent() 函数中,我们使用了另外一种 QString 的构造方法。我们使用类似 C 风格的格式化函数 sprintf() 来构造 QString。
运行上面的代码,当我们点击了一下鼠标之后,label 上将显示鼠标当前坐标值。
为什么要点击鼠标之后才能在 mouseMoveEvent() 函数中显示鼠标坐标值?这是因为 QWidget 中有一个 mouseTracking 属性,该属性用于设置是否追踪鼠标。只有鼠标被追踪时,mouseMoveEvent() 才会发出。如果 mouseTracking 是 false(默认即是),组件在至少一次鼠标点击之后,才能够被追踪,也就是能够发出 mouseMoveEvent() 事件。如果 mouseTracking 为 true,则 mouseMoveEvent() 直接可以被发出。知道了这一点,我们就可以在 main() 函数中直接设置下:EventLabel *label = new EventL
label-&setWindowTitle(&MouseEvent Demo&);
label-&resize(300, 200);
label-&setMouseTracking(true);
label-&show();复制代码这样子就没有这个问题了。
本帖子中包含更多资源
才可以下载或查看,没有帐号?
这一篇文章的意思好像是在说:由于事件函数是virtual protected的,那么我们可以在子类里面重载他们,来定义我们自己的事件处理操作,那么当事件触发时(或者说事件来临时)就会执行我们在子类中定义的事件处理函数。
这篇是在说,事件是用户或系统发出的,去执行某一功能的。事件不是顺序执行的,而是用户点击哪个button,就执行哪个事件,,所以,我们是没有办法预测事件的发生顺序的。如果用户什么button都不点击,这个程序就会被停滞。 在Qt中,事件和信号有些相似。Qt不关心事件,关心的是时间发生的信号,也就是说,我们不管click了哪一个button,只关心clicked()这个信号,关键是转到信号槽的操作。这并不是说事件和信号可以相互替代。事件有事件的特点,Qt用事件队列来管理事件,事件不会立即发生(也有立即发生的情况),也会有过滤机制,而信号一旦发出,会立即调用connect函数执行。使用组件时,我们关注的是信号。使用自定义组件时,我们就要关注事件了,以为我们需要程序按照我们的设想,不是系统自定义的方式来执行。我们一直在用的QCoreApplication类,他的exec()函数就是事件循环的开始。事件发生时,Qt创建一个事件对象,事件都是QEvent类型的。创建完成后,Qt将这个事件对象交给QObject类的event()函数,event()函数将这个事件根据类型分配给event handelr事件处理函数。。。。。比如鼠标事件,关键字事件.........后面用一个实例来讲,听清楚的。心态不一样...果然看程序都不一样了。。。。。
准确的说是,如果这些事件响应函数是接口函数的话,我们需要在子类中实现它,以便处理自己的响应。
很详细的讲解,认真学习
头文件是什么啊,是QT4还是QT5啊
怎么没有贴头文件,也没有说是什么版本,不好编译啊
越来越看不懂了,哭死....
很详细的讲解,认真学习
额,事件! 继续学习!!!!!!!!!!!!
主题帖子积分qt中如何激活和关闭一个事件_百度知道
qt中如何激活和关闭一个事件
比如我有一个画图的事件,我想用一个按键去控制激活这个画图事件,但是我看到的例子关于事件都是直接程序运行就看是的,不知道应该怎么搞
我有更好的答案
其他类似问题
您可能关注的内容
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。QT的事件分发、事件过滤器
由 匿名 (未验证)
一、事件的流向QT的各种控件(QObject的子类)都有事件处理成员函数,例如:bool QObject::event(QEvent *e);//所有事件
dragEnterEvent(QDragEnterEvent *);//拖拽进入事件
focusInEvent(QFocusEvent *);//获得焦点事件
mousePressEvent(QMouseEvent *);//鼠标压下事件
····//还有几十个各种类型的事件,不一一列举了,任何一个控件的帮助文件里都可以查到这些事件需要继承父类重写覆盖之后才能使用,这里主要想说明一点,事件的分发方向,是从子控件一步步向上传递到祖宗控件的,如果子控件拦截了事件,那么父控件就接收不到事件了。子控件怎么拦截事件,怎么不拦截事件,可以先看这个例子:添加新类QPushButtonEx,它的父类为QPushButton,QPushButtonEx 覆盖 QPushButton 的鼠标按下事件:void QButtonEx::mousePressEvent(QMouseEvent *e)
qDebug()&&"button pressed";
e-&ignore();//ignore的作用是使事件继续向父控件传递
}在一个MainWindow上添加一个QPushButton(提升为QPushButtonEx),也重写MainWindow的鼠标按下事件:void MainWindow::mousePressEvent(QMouseEvent *e)
qDebug()&&"mainwindow pressed";
e-&ignore();
}点击按钮,运行结果如下:这也就验证了事件的传递方向,子控件先接收到事件,父控件后接收到事件。尤其注意代码中的e-&ignore();这句的作用是使得事件能够继续流向父控件;与之相反的是e-&accept();它将事件拦截,父控件将无法收到已经被accept过的事件;重写的事件处理函数中,如果不写accept或ignore,那么默认为:事件被accept!上面的代码为例,如果QButtonEx::mousePressEvent()函数中不写e-&ignore(),或者写e-&accept(),那么MainWindow::mousePressEvent()函数将不会被触发,运行结果中只能看到打印:button pressed二、
添加新评论QT学习小结之鼠标事件
时间: 15:02:53
&&&& 阅读:356
&&&& 评论:
&&&& 收藏:0
标签:qt鼠标事件所包含的头文件&QMouseEvent&,QMouseEvent中包含了两个坐标,一是全局坐标(globalPos()),即桌面坐标,这个跟Windows下的调用的getCursorPos函数得到的结果一致。鼠标事件常见的有mousePressEvent(),mouseReleaseEvent(),mouseDoubleClickEvent(),mouseMoveEvent(),下面我就贴上几段代码吧void Event_test::mouseMoveEvent(QMouseEvent *event) & & //鼠标拖动事件{ & &QP & &point = QCursor::pos(); & &qDebug()&&"point"&&point.x()&&" & &"&&point.y();&&&&qDebug()&&"move&:"&&"&&"&&event-&pos().x()&&"&&"&&event-&pos().y();}void Event_test::mousePressEvent(QMouseEvent *event) & //鼠标按下事件{ & &QString str="("+QString::number(event-&x())+","+QString::number(event-&y())+")"; & &if(event-&button()==Qt::LeftButton) & &{ & & & &statusBar()-&showMessage (tr("Mouse Left Button Pressed:")+str);//在状态栏中显示临时信息 & &} & &else if(event-&button()==Qt::RightButton) & &{ & & & &statusBar()-&showMessage (tr("Mouse Right Button Pressed:")+str); & &} & &else if(event-&button()==Qt::MidButton) & &{ & & & & statusBar()-&showMessage (tr("Mouse Middle Button Pressed:")+str); & &} & &qDebug()&&"Press "&&" & "&&event-&pos().x()&&" & "&&event-&pos().y();}void Event_test::mouseReleaseEvent(QMouseEvent *event) & & &//鼠标释放事件{ & &QString str="("+QString::number(event-&x())+","+QString::number(event-&y())+")"; & & & &statusBar()-&showMessage (tr("Mouser Released:")+str,3000); & &qDebug()&&"release "&&" & &"&&event-&pos().x()&&" & &"&&event-&pos().y();}void Event_test::mouseDoubleClickEvent(QMouseEvent *event) & &//鼠标双击事件{ & &QString str="("+QString::number(event-&x())+","+QString::number(event-&y())+")"; & &if(event-&button()==Qt::LeftButton) & &{ & & & & &statusBar()-&showMessage (tr("Mouse Left Button Double Clicked:")+str); & &} & & else if(event-&button()==Qt::RightButton) & &{ & & & & &statusBar()-&showMessage (tr("Mouse Right Button Double Clicked:")+str); & &} & &else if(event-&button()==Qt::MidButton) & &{ & & & & &statusBar()-&showMessage (tr("Mouse Middle Button Double Clicked:")+str); & &}}本文出自 “” 博客,请务必保留此出处标签:原文地址:http://.blog.51cto.com/7760
&&国之画&&&& &&&&chrome插件
版权所有 京ICP备号-2
迷上了代码!13:19 提问
QT按钮点击事件,怎么点击的是哪一个按钮
qt客户端程序中动态创建多个按钮,点击进入同一个界面,但点击不同按钮时界面上显示不同数据,要怎么才能实现啊
qpushbutton的clicked事件能不能重写成带参数的信号传递啊
按赞数排序
你可以通过多加一层抽象来完成,通过子类化来完成,在创建BUTTON的时候通过多传入一个参数index,并且赋给该类的私有成员,等会点击的时候就可以根据index知道是哪个按钮触发的
class MyPushButton : public QPushButton
explicit MyPushButton(int index, QWidget *parent = 0) : QPushButton(parent), index(index)
connect(this, SIGNAL(clicked()), this, SLOT(OnClicked()));
public slots:
void OnClicked(){qDebug() &&//你可以在这里emit(index),槽函数就可以根据index知道是哪个按钮发出的信号}
下面几行是创建BUTTON的代码
for(int i = 0; i & 3; i++)
MyPushButton *button = new MyPushButton(i, this);
button-&setText("button" + QString::number(i));
button-&move(120 * i + 10, 100);
button-&show();
不懂可以私聊我
使用qt中自带的信号映射器QSignalMapper,你在百度中搜索这个类名就有简单用法,楼上的也是一种方法。思想都是差不多。
可以在槽函数中获取,qobject* o = sender();
qstring strName = o.objectName()
就知道是哪个按钮点击的了
1.根据sender()来判断
2.QButtonGroup,判定id
3.QSignalMapper
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐

我要回帖

更多关于 微信网页屏蔽分享按钮 的文章

 

随机推荐