IT评测·应用市场-qidao123.com技术社区

标题: Qt底子006(变乱) [打印本页]

作者: 自由的羽毛    时间: 前天 12:58
标题: Qt底子006(变乱)
消息对话框QMessageBox

QMessageBox 是 Qt 框架中用于体现消息框的一个类,它常用于向用户体现信息、扣问问题大概陈诉错
误。以下是 QMessageBox 的一些主要用途:
代码示例
以下是一个简单的 QMessageBox 使用示例,展示了如何创建一个根本的消息框:
  1. #include <QApplication>
  2. #include <QMessageBox>
  3. int main(int argc, char *argv[]) {
  4.     QApplication app(argc, argv);
  5.     QMessageBox msgBox;
  6.     msgBox.setWindowTitle("Message Title");
  7.     msgBox.setText("This is the main message text.");
  8.     msgBox.setInformativeText("This is additional informative text.");
  9.     msgBox.setIcon(QMessageBox::Information);
  10.     msgBox.addButton(QMessageBox::Ok);
  11.     msgBox.addButton(QMessageBox::Cancel);
  12.     msgBox.setDefaultButton(QMessageBox::Ok);
  13.     int ret = msgBox.exec();
  14.     if (ret == QMessageBox::Ok) {
  15.         // 用户点击了 OK
  16.     } else if (ret == QMessageBox::Cancel) {
  17.         // 用户点击了 Cancel
  18.     }
  19.     return app.exec();
  20. }
复制代码
​ 在这个例子中,我们创建了一个 QMessageBox 对象,并设置了窗口标题、主要文本、附加信息文本和图标。还添加了两个按钮(OK 和 Cancel),并设置了默认按钮。通过 exec() 方法体现消息框,并根据用户的选择执行不同的操纵。由于 QMessageBox 是为标准对话框计划的,其定制本领有限,但你可以通过添加自界说按钮来实现肯定程度的定制。例如,如果你想要添加一个自界说的按钮,可以这样做:
  1. #include <QApplication>
  2. #include <QMessageBox>
  3. #include <QPushButton>
  4. int main(int argc, char *argv[]) {
  5.     QApplication app(argc, argv);
  6.     QMessageBox msgBox;
  7.     msgBox.setText("Custom message box with a custom button");
  8.     QPushButton *customButton = msgBox.addButton("自定义的名字",
  9.                                                  QMessageBox::ActionRole);
  10.     msgBox.exec();
  11.     if (msgBox.clickedButton() == customButton) {
  12.         // 用户点击了自定义按钮
  13.     }
  14.     return app.exec();
  15. }
复制代码
​ 在这个例子中,通过 addButton() 方法添加了一个自界说按钮。按钮的脚色被设置为QMessageBox::ActionRole ,这意味着它将被放置在对话框的底部,与其他标准按钮一起。通过检查用户点击的按钮来确定是否点击了自界说按钮。
快捷键开辟底子

​ 在 Qt 中实现快捷键功能通常涉及到 QShortcut 类的使用。下面是一个简单的代码示例,展示了如安在Qt 应用程序中为特定功能设置快捷键:
  1. // 创建一个快捷键 (Ctrl + N) 并关联到窗口
  2. QShortcut *shortcut = new QShortcut(QKeySequence("Ctrl+N"), &window);
  3. // 当快捷键被按下时,显示一个消息框
  4. QObject::connect(shortcut, &QShortcut::activated, [&]() {
  5. QMessageBox::information(&window, "Shortcut Activated", "Ctrl+N was
  6. pressed");
  7. });
复制代码
​ 在这个示例中,当用户按下 Ctrl + N 时,程序将弹出一个消息框。这是通过创建一个 QShortcut 对象,并将其快捷键序列设置为 “Ctrl+N” 来实现的。然后,将 activated 信号连接到一个 Lambda 函数,该函数在快捷键被激活时执行。这种方法非常适用于为特定操纵提供快速访问路径。
变乱

变乱处置惩罚过程

​ 众所周知Qt是一个基于C++的框架,主要用来开辟带窗口的应用程序(不带窗口的也行,但不是主流)。我们使用的基于窗口的应用程序都是基于变乱,其目的主要是用来实现回调(因为只有这样程序的效率才是最高的)。以是在Qt框架内部为我们提供了一些列的变乱处置惩罚机制,当窗口变乱产生之后,变乱会经过: 变乱派发 -> 变乱过滤->变乱分发->变乱处置惩罚 几个阶段。Qt窗口中对于产生的一系列变乱都有默认的处置惩罚动作,如果我们有特殊需求就必要在合适的阶段重写变乱的处置惩罚动作,好比信号与槽就是一种
​ ==变乱(event)==是由系统大概 Qt 自己在不同的场景下发出的。当用户按下/移动鼠标、敲下键盘,大概是窗口关闭/大小发生变化/隐藏或体现都会发出一个相应的变乱。一些变乱在对用户操纵做出相应时发出,如鼠标/键盘变乱等;另一些变乱则是由系统自动发出,如计时器变乱。每一个Qt应用程序都对应一个唯一的 QApplication 应用程序对象,然后调用这个对象的 exec() 函数,这样Qt框架内部的变乱检测就开始了( 程序将进入变乱循环来监听应用程序的变乱 )。
  1. int main(int argc, char *argv[])
  2. {
  3.     QApplication a(argc, argv);
  4.     MainWindow* w = new MainWindow;
  5.     w.show();
  6.     return a.exec();
  7. }
复制代码
变乱在Qt中产生之后,的分发过程是这样的:
  1. [override virtual] bool QApplication::notify(QObject *receiver, QEvent *e);
复制代码
  1. // 需要先给窗口安装过滤器, 该事件才会触发
  2. [virtual] bool QObject::eventFilter(QObject *watched, QEvent *event)
复制代码
  1. [override virtual protected] bool QWidget::event(QEvent *event);
复制代码
  1. // 鼠标按下
  2. [virtual protected] void QWidget::mousePressEvent(QMouseEvent *event);
  3. // 鼠标释放
  4. [virtual protected] void QWidget::mouseReleaseEvent(QMouseEvent *event);
  5. // 鼠标移动
  6. [virtual protected] void QWidget::mouseMoveEvent(QMouseEvent *event);
复制代码
重写变乱案例:
程序关闭之前的扣问,鼠标进入,鼠标离开,窗口大小改变
  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. #include <QDebug>
  4. #include <QMessageBox>
  5. #include <QWheelEvent>
  6. Widget::Widget(QWidget *parent)
  7.     : QWidget(parent)
  8.         , ui(new Ui::Widget)
  9.     {
  10.         ui->setupUi(this);
  11.     }
  12. Widget::~Widget()
  13. {
  14.     delete ui;
  15. }
  16. void Widget::enterEvent(QEvent *event)
  17. {
  18.     qDebug() << "mouse enter";
  19. }
  20. void Widget::leaveEvent(QEvent *event)
  21. {
  22.     qDebug() << "mouse leave";
  23. }
  24. void Widget::wheelEvent(QWheelEvent *event)
  25. {
  26.     qDebug() << event->angleDelta();
  27. }
  28. void Widget::closeEvent(QCloseEvent *event)
  29. {
  30.     int ret = QMessageBox::warning(this, tr("My Application"),
  31.                                    tr("close the window\n"
  32.                                       "Do you want to close the window?"),
  33.                                    QMessageBox::Ok | QMessageBox::No
  34.                                   );
  35.     switch(ret){
  36.         case QMessageBox::Ok:
  37.             event->accept();
  38.             break;
  39.         case QMessageBox::No:
  40.             event->ignore();
  41.             break;
  42.     }
  43. }
  44. void Widget::resizeEvent(QResizeEvent *event)
  45. {
  46.     qDebug() << "oldSize:" << event->oldSize()
  47.         << "newSize:" << event->size();
  48. }
  49. void Widget::on_pushButton_clicked()
  50. {
  51. }
复制代码
自界说按键
mybutton.h
  1. #ifndef MYBUTTON_H
  2. #define MYBUTTON_H
  3. #include <QWidget>
  4. class MyButton : public QWidget
  5. {
  6. Q_OBJECT
  7. private:
  8. QPixmap pic;
  9. public:
  10. explicit MyButton(QWidget *parent = nullptr);
  11. protected:
  12. void mousePressEvent(QMouseEvent *event) override;
  13. void leaveEvent(QEvent *event) override;
  14. void enterEvent(QEvent *event) override;
  15. void paintEvent(QPaintEvent *event) override;
  16. signals:
  17. void clicked();
  18. };
  19. #endif //
复制代码
mybutton.cpp
  1. #include "mybutton.h"
  2. #include <QPainter>
  3. MyButton::MyButton(QWidget *parent) : QWidget(parent)
  4. {
  5.     pic.load(":/o1.png");
  6.     setFixedSize(pic.size());
  7.     update();
  8. }
  9. void MyButton::mousePressEvent(QMouseEvent *event)
  10. {
  11.     pic.load(":/o3.png");
  12.     update();
  13.     emit clicked();
  14. }
  15. void MyButton::leaveEvent(QEvent *event)
  16. {
  17.     pic.load(":/o1.png");
  18.     update();
  19. }
  20. void MyButton::enterEvent(QEvent *event)
  21. {
  22.     pic.load(":/o2.png");
  23.     update();
  24. }
  25. void MyButton::paintEvent(QPaintEvent *event)
  26. {
  27.     QPainter painter(this);
  28.     painter.drawPixmap(rect(),pic);
  29. }
复制代码
变乱过滤器

我们通过继承QTextEdit来重写变乱实现Ctrl加滚轮的检测,另有一种处置惩罚方式,叫做变乱过滤器
在Qt的变乱处置惩罚过程中,引入变乱过滤器(Event Filter)可以让你在变乱到达目的对象之进步行拦截和处置惩罚。这是一种强大的机制,允许你在不同对象间共享变乱处置惩罚逻辑或在父对象中会合处置惩罚特定变乱。
下面是加入变乱过滤器的步骤:
变乱过滤器特别适用于以下环境:

通过使用变乱过滤器,Qt应用程序可以得到更大的灵活性和更细粒度的变乱处置惩罚控制。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4