为啥QT界面这里有个红色禁止

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥QT界面这里有个红色禁止相关的知识,希望对你有一定的参考价值。

参考技术A 没有用布局管理器对窗口界面的控件进行管理吧。实际上运行的时候程序不会出现什么问题,可是如果对窗口进行放大缩小之类的操作会导致窗口控件布局混乱,影响整个程序的美观

为啥 Qt mouseReleaseEvent 不会触发?

【中文标题】为啥 Qt mouseReleaseEvent 不会触发?【英文标题】:How come a Qt mouseReleaseEvent won't fire?为什么 Qt mouseReleaseEvent 不会触发? 【发布时间】:2013-08-09 01:52:55 【问题描述】:

所以,我有一个自定义 QLabel 类,用作按钮。单击标签时,背景颜色会从红色变为绿色。在鼠标释放事件中,背景变回红色。但是,如果我向小部件的“单击”信号添加一个插槽,则鼠标释放事件似乎永远不会被触发。标签保持绿色。目前,我有它,所以当点击标签时,会显示一个 QMessageBox 。然而,即使在消息框关闭后,标签仍保持绿色。我尝试将它的 focusOutEvent 连接到将背景变为红色的同一个插槽,但它仍然无法正常工作。如何在释放鼠标后立即将按钮恢复为红色背景?我希望这是有道理的。有什么想法吗?

#include "ubtn.h"
QString sty  =  "ubtnbackground:red;";
QString styd =  "ubtnbackground:green;";

QWidget *obj;
ubtn::ubtn(QWidget *parent) :
    QLabel(parent)

    this->setStyleSheet(sty);
    connect(this, SIGNAL(onBlur(bool)), SLOT(defaultBtn()));


void ubtn::defaultBtn()

    this->setStyleSheet(sty);
    this->repaint();


void ubtn::downBtn()

    this->setStyleSheet(styd);
    this->repaint();


void ubtn::mousePressEvent(QMouseEvent *ev)

    downBtn();
    emit clicked();


void ubtn::mouseReleaseEvent(QMouseEvent *ev)
 
    defaultBtn();
 

void ubtn::focusOutEvent(QFocusEvent *e)
 
    QLabel::focusOutEvent(e);
    emit(onBlur(true));
 

【问题讨论】:

【参考方案1】:

好的,所以问题是当你显示 QMessageBox 时,QMessageBox 成为活动窗口......所以当用户释放鼠标按钮时,mouseReleaseEvent 会转到 QMessageBox 而不是你的 ubtn。

我认为解决该问题的最简单方法是让 ubtn 从 mouseReleaseEvent() 方法而不是 mousePressEvent() 调用“emit clicked()”;这样按钮可以在 QMessageBox 显示之前恢复到其常规颜色,因此会发生活动窗口更改。

【讨论】:

哇,好主意!有用!不知道为什么我没有想到这一点。无论如何,谢谢你:)【参考方案2】:

在 defaultBtn 函数中试试这个:

setStyleSheet(sty);
style()->unpolish(this);
style()->polish(this);

【讨论】:

以上是关于为啥QT界面这里有个红色禁止的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Qt 用户界面在发布模式和调试模式下看起来不同

Qt 如何避免打开多个相同子界面?

这几天Qt写的程序运行后界面有个接受鼠标双击的,双击就出现Qt出现下面的错误,系统出现图片中的错误

为啥qt designer设计界面和用python运行得到的不一样?

为啥在Windows下开发 QT 要用到 MinGW? 他的作用是啥?

关于Qt界面的设计(界面衔接)一般做法