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;可以用来调试等;也可以处理发送给失效窗口部件的鼠标事件;

猜你喜欢

转载自www.cnblogs.com/czwlinux/p/12321109.html