当我将我的QT版本从4.8.6升级到4.8.7时,widget列表会失去焦点
When i upgraded my QT version from 4.8.6 to 4.8.7, the widget list will lost the focus
// 例如当我在小部件列表中按下按键时。它不会关注选项。
我查看日志,然后发现当它失去焦点时,焦点在背景小部件列表上。
// - 如果我的应用程序只有一个小部件列表,当我按下按键时它不会失去焦点。
// - 如果我的应用程序有两个小部件列表,第二个在第一个下面。当我第一次按下按键时,它会聚焦第一个选项,但当我第二次按下按键时,它会聚焦第二个小部件列表。
// 这个问题困扰了我一个星期,请问有高手可以帮我解决一下吗?我非常感谢你。谢谢.
Follow is my test code,
main.cpp
#include <QtGui/QApplication>
#include "dialog.h"
#include <QFile>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QFont newFont("Times", 7, QFont::Normal);
a.setFont(newFont);
QPalette *palette = new QPalette;
palette->setBrush(QPalette::Window, Qt::white);
palette->setBrush(QPalette::WindowText, Qt::black);
palette->setBrush(QPalette::BrightText, Qt::white);
palette->setBrush(QPalette::Base, Qt::white);
palette->setBrush(QPalette::AlternateBase, Qt::white);
palette->setBrush(QPalette::Highlight, Qt::black);
palette->setBrush(QPalette::Disabled, QPalette::Highlight, Qt::black);
a.setPalette(*palette);
QFile file(":/qss/mainWindow.qss");
file.open(QFile::ReadOnly);
a.setStyleSheet(file.readAll());
Dialog dlg;
//set part of window property: hide title frame
dlg.setWindowFlags(Qt::FramelessWindowHint);
//move window to zero point: location(0,0)
dlg.move(0, 0);
dlg.activateWindow();
dlg.show();
return a.exec();
}
dialog.cpp
#include <QDebug>
#include "dialog.h"
#include "ui_dialog.h"
#include "QKeyEvent"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
InitWidget();
InstallFilters();
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::InitWidget()
{
this->m_pView = NULL;
for(int index=0; index<10; index++)
{
ui->listWidget->insertItem(index, QString("Item %1").arg(index));
}
ui->listWidget->hide();
}
bool Dialog::InstallFilters()
{
ui->lineEdit->installEventFilter(this);
ui->lineEdit_2->installEventFilter(this);
ui->listWidget->installEventFilter(this);
ui->textEdit->installEventFilter(this);
ui->textEdit->setFocus();
ui->textEdit->setText("I am background");
return true;
}
bool Dialog::eventFilter(QObject *o, QEvent *e)
{
qDebug()<<"The Obj is"<<o->objectName()<<"EventType:"<<e->type();
if(e->type()!= QEvent::KeyPress)
return QDialog::eventFilter(o, e);
QKeyEvent *pKeyEvent = dynamic_cast<QKeyEvent*>(e);
switch(pKeyEvent->key())
{
case Qt::Key_F10:
case Qt::Key_M:
{
ui->listWidget->show();
ui->listWidget->setFocus();
ui->listWidget->setCurrentRow(0);
return true;
}
case Qt::Key_F3:
case Qt::Key_C:
{
ui->listWidget->hide();
ui->textEdit->setFocus();
return true;
}
}
return QDialog::eventFilter(o, e);
}
qt-embedded 的键盘导航功能在我的 4.8.6 配置中被默认禁用。但是是在4.8.7打开的。所以它显示重叠,我们找不到焦点。因此,箭头键更改了活动小部件而不是活动列表元素。
解决方案,
QT_EMBEDDED_KEYPAD_FLAGS = ""
// 例如当我在小部件列表中按下按键时。它不会关注选项。 我查看日志,然后发现当它失去焦点时,焦点在背景小部件列表上。
// - 如果我的应用程序只有一个小部件列表,当我按下按键时它不会失去焦点。 // - 如果我的应用程序有两个小部件列表,第二个在第一个下面。当我第一次按下按键时,它会聚焦第一个选项,但当我第二次按下按键时,它会聚焦第二个小部件列表。
// 这个问题困扰了我一个星期,请问有高手可以帮我解决一下吗?我非常感谢你。谢谢.
Follow is my test code,
main.cpp
#include <QtGui/QApplication>
#include "dialog.h"
#include <QFile>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QFont newFont("Times", 7, QFont::Normal);
a.setFont(newFont);
QPalette *palette = new QPalette;
palette->setBrush(QPalette::Window, Qt::white);
palette->setBrush(QPalette::WindowText, Qt::black);
palette->setBrush(QPalette::BrightText, Qt::white);
palette->setBrush(QPalette::Base, Qt::white);
palette->setBrush(QPalette::AlternateBase, Qt::white);
palette->setBrush(QPalette::Highlight, Qt::black);
palette->setBrush(QPalette::Disabled, QPalette::Highlight, Qt::black);
a.setPalette(*palette);
QFile file(":/qss/mainWindow.qss");
file.open(QFile::ReadOnly);
a.setStyleSheet(file.readAll());
Dialog dlg;
//set part of window property: hide title frame
dlg.setWindowFlags(Qt::FramelessWindowHint);
//move window to zero point: location(0,0)
dlg.move(0, 0);
dlg.activateWindow();
dlg.show();
return a.exec();
}
dialog.cpp
#include <QDebug>
#include "dialog.h"
#include "ui_dialog.h"
#include "QKeyEvent"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
InitWidget();
InstallFilters();
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::InitWidget()
{
this->m_pView = NULL;
for(int index=0; index<10; index++)
{
ui->listWidget->insertItem(index, QString("Item %1").arg(index));
}
ui->listWidget->hide();
}
bool Dialog::InstallFilters()
{
ui->lineEdit->installEventFilter(this);
ui->lineEdit_2->installEventFilter(this);
ui->listWidget->installEventFilter(this);
ui->textEdit->installEventFilter(this);
ui->textEdit->setFocus();
ui->textEdit->setText("I am background");
return true;
}
bool Dialog::eventFilter(QObject *o, QEvent *e)
{
qDebug()<<"The Obj is"<<o->objectName()<<"EventType:"<<e->type();
if(e->type()!= QEvent::KeyPress)
return QDialog::eventFilter(o, e);
QKeyEvent *pKeyEvent = dynamic_cast<QKeyEvent*>(e);
switch(pKeyEvent->key())
{
case Qt::Key_F10:
case Qt::Key_M:
{
ui->listWidget->show();
ui->listWidget->setFocus();
ui->listWidget->setCurrentRow(0);
return true;
}
case Qt::Key_F3:
case Qt::Key_C:
{
ui->listWidget->hide();
ui->textEdit->setFocus();
return true;
}
}
return QDialog::eventFilter(o, e);
}
qt-embedded 的键盘导航功能在我的 4.8.6 配置中被默认禁用。但是是在4.8.7打开的。所以它显示重叠,我们找不到焦点。因此,箭头键更改了活动小部件而不是活动列表元素。
解决方案, QT_EMBEDDED_KEYPAD_FLAGS = ""