label.cpp
Label::Label(QWidget *parent) :
QLabel(parent)
{
resize(100, 50);
setFocusPolicy(Qt::ClickFocus);//必须要设置,因为label默认没有焦点
qDebug() << "focusPolicy: " << focusPolicy();
//方法一
// setStyleSheet("QLabel{background:transparent; border-width: 2px; border-style: none;}\
// QLabel:hover{border-style: dashed;}\
// QLabel:focus{border-style: dashed;}");
}
//方法二
void Label::focusInEvent(QFocusEvent *event)
{
setText("in");
setStyleSheet("QLabel:focus{background:transparent; border-width: 2px; border-style: dashed;}");
}
void Label::focusOutEvent(QFocusEvent *event)
{
setText("out");
setStyleSheet("QLabel{background:transparent; border-width: 2px; border-style: none;}\
QLabel:hover{border-style: dashed;}");
}
textedit.cpp
TextEdit::TextEdit(QWidget *parent):
QTextEdit(parent)
{
// setFocusPolicy(Qt::ClickFocus);
qDebug() << "focusPolicy: " << focusPolicy();//textEdit默认具有焦点,所以不用设置焦点
//方法一: recommended
setStyleSheet("QTextEdit{background:transparent; border-width: 2px; border-style: none;}\
QTextEdit:hover{border-style: dashed;}\
QTextEdit:focus{border-style: dashed;}");
}
//方法二: 切换焦点状态时文本位置有变化, not recommended
void TextEdit::focusInEvent(QFocusEvent *event)
{
setText("in");
setStyleSheet("QTextEdit:focus{background:transparent; border-width: 2px; border-style: dashed;}");
}
void TextEdit::focusOutEvent(QFocusEvent *event)
{
setText("out");
setStyleSheet("QTextEdit{background:transparent; border-width: 2px; border-style: none;}\
QTextEdit:hover{border-style: dashed;}");
}
有几点注意点:
- 一个拥有焦点(focus)的QWidget才可以接受键盘事件
- 一些特殊按键的处理,比如tab键先于keypressevent触发,需要在event事件中提前捕获等。