Qt Gui 第七章

1、processEvents

该函数用来处理窗口的各种事件,重绘和event

复制代码
    for (int row = 0; row < RowCount; ++row) {
        for (int column = 0; column < ColumnCount; ++column) {
            QString str = formula(row, column);
            if (!str.isEmpty())
                out << quint16(row) << quint16(column) << str;
        }
        QThread::sleep(1);
        qApp->processEvents(/*QEventLoop::ExcludeUserInputEvents*/);
    }
复制代码

 

如上,当执行到那个函数的时候,程序会去调用等待执行的窗口事件;但是如果此时咱们再点击保存等按钮的时候程序依旧会被相应,再次调用该函数,重复执行;所以我们添加该参数

QEventLoop::ExcludeUserInputEvents禁止用户的各种输入,包括按键和鼠标;

 

qApp是QApplication类型的全局变量;

#define qApp (static_cast<QApplication *>(QCoreApplication::instance()))

2、QProgressDialog

 Qt自带的进度条;

复制代码
    QProgressDialog progress(this);
    progress.setLabelText(tr("Saving %1").arg(fileName));
    progress.setRange(0, RowCount);
    progress.setModal(true);
    for (int row = 0; row < RowCount; ++row) {
        progress.setValue(row);
        qApp->processEvents();
        if (progress.wasCanceled()) {
            file.remove();
            return false;
        }
        for (int column = 0; column < ColumnCount; ++column) {
            QString str = formula(row, column);
            if (!str.isEmpty())
                out << quint16(row) << quint16(column) << str;


        }
        QThread::sleep(1);
    }
复制代码

 

 3、事件过滤器

当不想子类化窗口部件,又要处理该窗口的事件的时候可以通过事件过滤器来执行;

    textEdit = new QTextEdit;
    textEdit->installEventFilter(this);

如上,将textEdit注册了事件过滤,则当textEdit收到消息的时候,会先到this这个窗口的

bool eventFilter(QObject *watched, QEvent *event);

中执行;如下示例所示:

复制代码
bool MailClient::eventFilter(QObject *watched, QEvent *event)
{
    if (watched == textEdit) {
        if (event->type() == QEvent::KeyPress) {
            QKeyEvent* keyevent = static_cast<QKeyEvent*>(event);
            if (keyevent->key() == Qt::Key_Space) {
                // do what you want
                return true;
            }
        }
    }
    return QMainWindow::eventFilter(watched, event);
}
复制代码

 

另外qApp也可以注册事件过滤器

qApp->installEventFilter(this);

则窗口所有的事件都会先经过this的eventFilter;可以用来调试等;也可以处理发送给失效窗口部件的鼠标事件;

 

 

 

 

 

 

 

 

posted @   LCAC  阅读(168)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
点击右上角即可分享
微信分享提示