均为自定义的按键事件控制焦点移动,在主界面将焦点移动到一个按钮上,通过按键事件,响应点击事件。在点击事件中执行弹出模态对话框,此时焦点应该在模态对话框的按钮上来,但点击按键事件,模态框关闭,主界面程序在执行ui->typeCombo->setFocus();后,自己又进行了一次“eventType_JOYSITCK_ENTER”事件。 之前做过很多尝试,首先考虑到主界面焦点是否依然存在,导致在模态对话框下焦点依然存在,对话框也只是阻塞了按下操作,在关闭后才执行。但后来发现,如果主界面的按钮是用鼠标点击的话,无论焦点是否是通过按键移动到此按钮,再使用按键操作对话框的按钮,就不会出现上述问题,而按键按下直接响应的也是按钮按下函数,就很迷茫。
在无措的时候,发现说这样编程可能造成内存泄漏,要加上this->setAttribute (Qt::WA_DeleteOnClose);后,只有第一次出现问题。但是有发现另一个问题就是如果在模态框中按钮按下需要时间相应的话,多次按下按钮界面会卡死。应该为弹出多个模态框叠加导致第一次对话框焦点遗失造成的吧。真的很迷了。。本人刚接触Qt没多久真的很迷茫,这个问题也纠结两天了,谢谢大家的帮助
对话框代码如下:
#include "messagebox.h"
#include "ui_messagebox.h"
#include <QDialog>
#include <QPainter>
#include <QCloseEvent>
#include <QDebug>
bool messageBox::isTrue = false;
messageBox::messageBox(QWidget *parent) :
QDialog(parent),
ui(new Ui::messageBox)
{
ui->setupUi(this);
this->setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint);
this->setWindowModality(Qt::ApplicationModal);
// this->setAttribute (Qt::WA_DeleteOnClose);
//register eventFilter
qApp->installEventFilter(this);
initWindow();
}
messageBox::~messageBox()
{
delete ui;
}
void messageBox::setContentText(QString contentText)
{
ui->content_text->setText(contentText);
}
void messageBox::setMessageType(MessageType messageType)
{
switch (messageType)
{
case MESSAGE_INFORMATION:
ui->content_icon->setPixmap(QPixmap(":/static/images/information.png"));
break;
case MESSAGE_WARNNING:
ui->content_icon->setPixmap(QPixmap(":/static/images/warning.png"));
break;
case MESSAGE_QUESTION:
ui->content_icon->setPixmap(QPixmap(":/static/images/question.png"));
break;
case MESSAGE_SUCCESS:
ui->content_icon->setPixmap(QPixmap(":/static/images/success.png"));
break;
case MESSAGE_ERROR:
ui->content_icon->setPixmap(QPixmap(":/static/images/error.png"));
break;
default:
break;
}
}
void messageBox::setButtonType(MessageButtonType buttonType)
{
switch (buttonType)
{
case BUTTON_OK:
ui->btn_ok->setGeometry(110,90,ui->btn_ok->width(),ui->btn_ok->height());
ui->btn_ok->setFocus();
ui->btn_cancel->setVisible(false);
break;
case BUTTON_CANCEL:
ui->btn_cancel->setGeometry(110,90,ui->btn_cancel->width(),ui->btn_cancel->height());
ui->btn_cancel->setFocus();
ui->btn_ok->setVisible(false);
break;
default:
ui->btn_ok->setFocus();
break;
}
}
int messageBox::showMessageBox(QWidget *parent, const QString &contentText, MessageType messageType, MessageButtonType messageButtonType, bool isModelWindow)
{
messageBox *m_box = new messageBox(parent);
m_box->setContentText(contentText);
m_box->setMessageType(messageType);
m_box->setButtonType(messageButtonType);
if (isModelWindow)
{
return m_box->exec();
}
else
{
m_box->show();
}
return -1;
}
void messageBox::initWindow()
{
ui->btn_ok->setText(tr("确定"));
ui->btn_cancel->setText(tr("取消"));
connect(ui->btn_ok, SIGNAL(clicked()), this, SLOT(onOkClicked()));
connect(ui->btn_cancel, SIGNAL(clicked()), this, SLOT(onCancelClicked()));
}
int messageBox::exec()
{
show();
messageBox::isTrue = true;
qDebug()<<"messageBox::isTrue = true;";
m_eventLoop = new QEventLoop(this);
m_eventLoop->exec();
return m_chooseResult;
}
void messageBox::paintEvent(QPaintEvent *event)
{
// 绘制窗口白色背景色;
QPainter painter(this);
QPainterPath pathBack;
pathBack.setFillRule(Qt::WindingFill);
pathBack.addRect(QRect(0, 0, this->width(), this->height()));
painter.setRenderHint(QPainter::SmoothPixmapTransform, true);
painter.fillPath(pathBack, QBrush(QColor(255, 255, 255)));
// 绘制窗口灰色边框;
QPen pen(QColor(222, 222, 222),2);
painter.setPen(pen);
painter.drawRect(0, 0, this->width() - 1, this->height() - 1);
return QWidget::paintEvent(event);
}
void messageBox::closeEvent(QCloseEvent *event)
{
if(m_eventLoop != NULL)
{
m_eventLoop->exit();
messageBox::isTrue = false;
qDebug()<<"messageBox::isTrue = false;";
}
event->accept();
}
void messageBox::onOkClicked()
{
m_chooseResult = ID_OK;
qDebug()<<"onOkClicked()";
this->close();
}
void messageBox:nCancelClicked()
{
m_chooseResult = ID_CANCEL;
this->close();
}
bool messageBox::eventFilter(QObject *obj, QEvent *event)
{
if(messageBox::isTrue){
bool okFocus = ui->btn_ok->hasFocus();
bool cancelFocus = ui->btn_cancel->hasFocus();
if(ui->btn_ok->isHidden() == false && ui->btn_cancel->isHidden() == false){
if(event->type() == eventType_UP){
if(cancelFocus){
focusPreviousChild();
ui->btn_ok->setFocus();
}
return false;
}
if(event->type() == eventType_DOWN){
if(okFocus){
focusNextChild();
ui->btn_cancel->setFocus();
}
return false;
}
}
if(event->type() == eventType_JOYSITCK_ENTER){
if(okFocus){
qDebug() << " eventType_JOYSITCK_ENTER";
ui->btn_ok->click();
}
if(cancelFocus){
ui->btn_cancel->click();
}
return false;
}
}
return QObject::eventFilter(obj,event);
}
主界面调用部分:
messageBox::showMessageBox(this, tr("未发现改变设置项!"), MESSAGE_WARNNING, BUTTON_OK, true);
ui->typeCombo->setFocus();
|