马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
消息对话框QMessageBox
QMessageBox 是 Qt 框架中用于体现消息框的一个类,它常用于向用户体现信息、扣问问题大概陈诉错
误。以下是 QMessageBox 的一些主要用途:
- 体现信息:向用户体现一些信息性的消息。
- 扣问用户决策:扣问用户一个问题,并根据其答复做出相应的操纵。
- 陈诉错误:向用户陈诉程序运行中的错误。
代码示例
以下是一个简单的 QMessageBox 使用示例,展示了如何创建一个根本的消息框:
- #include <QApplication>
- #include <QMessageBox>
- int main(int argc, char *argv[]) {
- QApplication app(argc, argv);
- QMessageBox msgBox;
- msgBox.setWindowTitle("Message Title");
- msgBox.setText("This is the main message text.");
- msgBox.setInformativeText("This is additional informative text.");
- msgBox.setIcon(QMessageBox::Information);
- msgBox.addButton(QMessageBox::Ok);
- msgBox.addButton(QMessageBox::Cancel);
- msgBox.setDefaultButton(QMessageBox::Ok);
- int ret = msgBox.exec();
- if (ret == QMessageBox::Ok) {
- // 用户点击了 OK
- } else if (ret == QMessageBox::Cancel) {
- // 用户点击了 Cancel
- }
- return app.exec();
- }
复制代码 在这个例子中,我们创建了一个 QMessageBox 对象,并设置了窗口标题、主要文本、附加信息文本和图标。还添加了两个按钮(OK 和 Cancel),并设置了默认按钮。通过 exec() 方法体现消息框,并根据用户的选择执行不同的操纵。由于 QMessageBox 是为标准对话框计划的,其定制本领有限,但你可以通过添加自界说按钮来实现肯定程度的定制。例如,如果你想要添加一个自界说的按钮,可以这样做:
- #include <QApplication>
- #include <QMessageBox>
- #include <QPushButton>
- int main(int argc, char *argv[]) {
- QApplication app(argc, argv);
- QMessageBox msgBox;
- msgBox.setText("Custom message box with a custom button");
- QPushButton *customButton = msgBox.addButton("自定义的名字",
- QMessageBox::ActionRole);
- msgBox.exec();
- if (msgBox.clickedButton() == customButton) {
- // 用户点击了自定义按钮
- }
- return app.exec();
- }
复制代码 在这个例子中,通过 addButton() 方法添加了一个自界说按钮。按钮的脚色被设置为QMessageBox::ActionRole ,这意味着它将被放置在对话框的底部,与其他标准按钮一起。通过检查用户点击的按钮来确定是否点击了自界说按钮。
快捷键开辟底子
在 Qt 中实现快捷键功能通常涉及到 QShortcut 类的使用。下面是一个简单的代码示例,展示了如安在Qt 应用程序中为特定功能设置快捷键:
- // 创建一个快捷键 (Ctrl + N) 并关联到窗口
- QShortcut *shortcut = new QShortcut(QKeySequence("Ctrl+N"), &window);
- // 当快捷键被按下时,显示一个消息框
- QObject::connect(shortcut, &QShortcut::activated, [&]() {
- QMessageBox::information(&window, "Shortcut Activated", "Ctrl+N was
- pressed");
- });
复制代码 在这个示例中,当用户按下 Ctrl + N 时,程序将弹出一个消息框。这是通过创建一个 QShortcut 对象,并将其快捷键序列设置为 “Ctrl+N” 来实现的。然后,将 activated 信号连接到一个 Lambda 函数,该函数在快捷键被激活时执行。这种方法非常适用于为特定操纵提供快速访问路径。
变乱
变乱处置惩罚过程
众所周知Qt是一个基于C++的框架,主要用来开辟带窗口的应用程序(不带窗口的也行,但不是主流)。我们使用的基于窗口的应用程序都是基于变乱,其目的主要是用来实现回调(因为只有这样程序的效率才是最高的)。以是在Qt框架内部为我们提供了一些列的变乱处置惩罚机制,当窗口变乱产生之后,变乱会经过: 变乱派发 -> 变乱过滤->变乱分发->变乱处置惩罚 几个阶段。Qt窗口中对于产生的一系列变乱都有默认的处置惩罚动作,如果我们有特殊需求就必要在合适的阶段重写变乱的处置惩罚动作,好比信号与槽就是一种
==变乱(event)==是由系统大概 Qt 自己在不同的场景下发出的。当用户按下/移动鼠标、敲下键盘,大概是窗口关闭/大小发生变化/隐藏或体现都会发出一个相应的变乱。一些变乱在对用户操纵做出相应时发出,如鼠标/键盘变乱等;另一些变乱则是由系统自动发出,如计时器变乱。每一个Qt应用程序都对应一个唯一的 QApplication 应用程序对象,然后调用这个对象的 exec() 函数,这样Qt框架内部的变乱检测就开始了( 程序将进入变乱循环来监听应用程序的变乱 )。
- int main(int argc, char *argv[])
- {
- QApplication a(argc, argv);
- MainWindow* w = new MainWindow;
- w.show();
- return a.exec();
- }
复制代码 变乱在Qt中产生之后,的分发过程是这样的:
- 当变乱产生之后,Qt使用用应用程序对象调用 notify() 函数将变乱发送到指定的窗口:
- [override virtual] bool QApplication::notify(QObject *receiver, QEvent *e);
复制代码
- 变乱在发送过程中可以通过变乱过滤器进行过滤,默认不对任何产生的变乱进行过滤。
- // 需要先给窗口安装过滤器, 该事件才会触发
- [virtual] bool QObject::eventFilter(QObject *watched, QEvent *event)
复制代码
- 当变乱发送到指定窗口之后,窗口的变乱分发器会对收到的变乱进行分类:
- [override virtual protected] bool QWidget::event(QEvent *event);
复制代码
- 变乱分发器会将分类之后的变乱(鼠标变乱、键盘变乱、绘图变乱。。。)分发给对应的变乱处置惩罚器函数进行处置惩罚,每个变乱处置惩罚器函数都有默认的处置惩罚动作(我们也可以重写这些变乱处置惩罚器函数),好比:鼠标变乱:
- // 鼠标按下
- [virtual protected] void QWidget::mousePressEvent(QMouseEvent *event);
- // 鼠标释放
- [virtual protected] void QWidget::mouseReleaseEvent(QMouseEvent *event);
- // 鼠标移动
- [virtual protected] void QWidget::mouseMoveEvent(QMouseEvent *event);
复制代码 重写变乱案例:
程序关闭之前的扣问,鼠标进入,鼠标离开,窗口大小改变
- #include "widget.h"
- #include "ui_widget.h"
- #include <QDebug>
- #include <QMessageBox>
- #include <QWheelEvent>
- Widget::Widget(QWidget *parent)
- : QWidget(parent)
- , ui(new Ui::Widget)
- {
- ui->setupUi(this);
- }
- Widget::~Widget()
- {
- delete ui;
- }
- void Widget::enterEvent(QEvent *event)
- {
- qDebug() << "mouse enter";
- }
- void Widget::leaveEvent(QEvent *event)
- {
- qDebug() << "mouse leave";
- }
- void Widget::wheelEvent(QWheelEvent *event)
- {
- qDebug() << event->angleDelta();
- }
- void Widget::closeEvent(QCloseEvent *event)
- {
- int ret = QMessageBox::warning(this, tr("My Application"),
- tr("close the window\n"
- "Do you want to close the window?"),
- QMessageBox::Ok | QMessageBox::No
- );
- switch(ret){
- case QMessageBox::Ok:
- event->accept();
- break;
- case QMessageBox::No:
- event->ignore();
- break;
- }
- }
- void Widget::resizeEvent(QResizeEvent *event)
- {
- qDebug() << "oldSize:" << event->oldSize()
- << "newSize:" << event->size();
- }
- void Widget::on_pushButton_clicked()
- {
- }
复制代码 自界说按键
mybutton.h
- #ifndef MYBUTTON_H
- #define MYBUTTON_H
- #include <QWidget>
- class MyButton : public QWidget
- {
- Q_OBJECT
- private:
- QPixmap pic;
- public:
- explicit MyButton(QWidget *parent = nullptr);
- protected:
- void mousePressEvent(QMouseEvent *event) override;
- void leaveEvent(QEvent *event) override;
- void enterEvent(QEvent *event) override;
- void paintEvent(QPaintEvent *event) override;
- signals:
- void clicked();
- };
- #endif //
复制代码 mybutton.cpp
- #include "mybutton.h"
- #include <QPainter>
- MyButton::MyButton(QWidget *parent) : QWidget(parent)
- {
- pic.load(":/o1.png");
- setFixedSize(pic.size());
- update();
- }
- void MyButton::mousePressEvent(QMouseEvent *event)
- {
- pic.load(":/o3.png");
- update();
- emit clicked();
- }
- void MyButton::leaveEvent(QEvent *event)
- {
- pic.load(":/o1.png");
- update();
- }
- void MyButton::enterEvent(QEvent *event)
- {
- pic.load(":/o2.png");
- update();
- }
- void MyButton::paintEvent(QPaintEvent *event)
- {
- QPainter painter(this);
- painter.drawPixmap(rect(),pic);
- }
复制代码 变乱过滤器
我们通过继承QTextEdit来重写变乱实现Ctrl加滚轮的检测,另有一种处置惩罚方式,叫做变乱过滤器
在Qt的变乱处置惩罚过程中,引入变乱过滤器(Event Filter)可以让你在变乱到达目的对象之进步行拦截和处置惩罚。这是一种强大的机制,允许你在不同对象间共享变乱处置惩罚逻辑或在父对象中会合处置惩罚特定变乱。
下面是加入变乱过滤器的步骤:
- 界说变乱过滤器: 变乱过滤器通常是一个重写了 QObject::eventFilter() 方法的对象。这个方法会在变乱传递给目的对象之前被调用。
- 安装变乱过滤器: 使用 QObject::installEventFilter() 方法安装变乱过滤器。这个方法告诉Qt在将变乱发送给特定对象之前先通过过滤器对象。例如,如果你想在父窗口中过滤子窗口的变乱,你必要在父窗口的对象上调用 installEventFilter() ,并将子窗口作为参数传递。
- 变乱过滤器逻辑: 在 eventFilter() 方法内部,你可以编写自界说逻辑来决定如那边置惩罚或忽略变乱。如果此方法返回 true ,则表现变乱已被处置惩罚,不应该继续传递;如果返回 false ,则变乱将正常传递给目的对象。
- 变乱分发: 当变乱发生时,Qt起首将变乱发送到安装了变乱过滤器的对象。在这一步,eventFilter() 方法被调用。
- 决定是否传递变乱: 根据 eventFilter() 方法的返回值,Qt决定是否继续向目的对象传递变乱。如果过滤器返回 true ,变乱处置惩罚到此结束;如果返回 false ,变乱继续传递到原始目的对象。
- 目的对象处置惩罚变乱: 如果变乱过滤器允许变乱继续传递,目的对象将像没有变乱过滤器存在时那样处置惩罚变乱。
变乱过滤器特别适用于以下环境:
- 当你想在不修改子类代码的环境下改变变乱的行为。
- 当多个对象必要共享雷同的变乱处置惩罚逻辑。
- 当你必要在更高的层级上监控或修改应用程序的变乱流。
通过使用变乱过滤器,Qt应用程序可以得到更大的灵活性和更细粒度的变乱处置惩罚控制。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |