247_QT_qt鼠标无法点击按钮,自写窗体继承自QWidget中的按钮点击没反应,按空格触发click信号

93 篇文章 3 订阅
65 篇文章 6 订阅

构造函数selfMessageBox中设置的背景窗体bgWidget,覆盖了原有窗体导致控件也全部被覆盖,所以无法点击
.

    bgWidget = new QWidget(this);
    bgWidget->setStyleSheet("background-color:"+defaultColor+";border-radius:9px;");
    bgWidget->resize(this->size());
    bgWidget->lower();//解决
    bgWidget->show();

.

在这里插入图片描述

selfMessageBox* selfMessageBox::m_pInstance = nullptr;
selfMessageBox* selfMessageBox::Instance()
{
    static QMutex mutex;
    QMutexLocker locker(&mutex);
    if(m_pInstance == nullptr)
    {
        m_pInstance = new selfMessageBox();
    }
    return m_pInstance;
}

void selfMessageBox::Destory()
{
    if(m_pInstance != nullptr)
    {
        delete m_pInstance;
        m_pInstance = nullptr;
    }
}

selfMessageBox::selfMessageBox(QWidget *parent):
    QWidget(parent)
{
    m_pPrompText = new QLabel(this);
    m_ptextTitle = new QLabel(this);

    m_ptitleIcon = new QLabel(this);
    m_ptitleIcon->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    m_ptitleIcon->setAlignment(Qt::AlignCenter);

    m_pokbutton = new textButton("确认",this);//textButton("确认", this);
    m_pcancelbutton = new textButton("取消",this);//new textButton("取消", this);
    m_pokbutton->installEventFilter(this);//设置事件过滤,eventFilter重新才会生效
    m_pcancelbutton->installEventFilter(this);

    QVBoxLayout * vlay = new QVBoxLayout(this);

    QHBoxLayout * titlehlay = new QHBoxLayout;
    titlehlay->addWidget(m_ptitleIcon);
    titlehlay->setSpacing(8);
    titlehlay->addWidget(m_ptextTitle);

    QWidget * bWidget = new QWidget(this);
    QHBoxLayout * textbuttonlay = new QHBoxLayout;
    textbuttonlay->addWidget(m_pokbutton);
    textbuttonlay->addWidget(m_pcancelbutton);
    bWidget->setLayout(textbuttonlay);

    vlay->addWidget(m_pPrompText);
    vlay->setSpacing(8);
    vlay->addLayout(titlehlay);
    vlay->setSpacing(8);
    //vlay->addLayout(textbuttonlay);
    vlay->addWidget(bWidget);

    setLayout(vlay);

    this->setMaximumSize(m_pPrompText->height() + m_ptitleIcon->height() + m_pokbutton->height() + 100, m_ptitleIcon->width() + 50);

    bgWidget = new QWidget(this);
    bgWidget->setStyleSheet("background-color:"+defaultColor+";border-radius:9px;");
    bgWidget->resize(this->size());
    bgWidget->lower();//这里没有降低背景QWidget等级,导致按钮无法点击
    bgWidget->show();

    connect(m_pokbutton, &textButton::clicked, this, &selfMessageBox::on_okbutton);
}

void selfMessageBox::warningdialog(QString promptTitle, QString textTitle, QString iconPath,QWidget *parent)//, int promptnum, bool hide
{
    QFont nameFont = QFont("Corbel", 12);
    QFontMetrics fm(nameFont);
    qreal height = fm.lineSpacing();

    m_pPrompText->setText(promptTitle);
    m_pPrompText->setFont(nameFont);
    m_pPrompText->setFixedHeight(height);
    m_pPrompText->setStyleSheet("color:#1c1c1c");

    m_ptextTitle->setText(textTitle);
    m_ptextTitle->setFont(nameFont);
    m_ptextTitle->setFixedHeight(height);
    m_ptextTitle->setStyleSheet("color:#1c1c1c");

    setDialogIcon(iconPath);
    setCancelButtonVisible(true);
    setOkButtonVisible(true);

    this->adjustSize();//自动调整大小
    this->show();
    //this->exec();//模态阻塞暂时可以不用

    update();
}

void selfMessageBox::setDialogIcon(const QString& iconPath)
{
    QPixmap pixmap(iconPath);
    QImage image = pixmap.toImage();
    m_ptitleIcon->setPixmap(QPixmap::fromImage(image).scaled(defaultIconSize, defaultIconSize, Qt::KeepAspectRatio)); // 设置图像大小为64x64像素,并保持其纵横比例
    m_ptitleIcon->setVisible(!iconPath.isEmpty()); // 设置图标可见性
}

void selfMessageBox::setOkButtonVisible(bool visible)
{
    m_pokbutton->setVisible(visible);
}

void selfMessageBox::setCancelButtonVisible(bool visible)
{
    m_pcancelbutton->setVisible(visible);
}

void selfMessageBox::exec()
{
    m_Loop.exec(); //利用事件循环实现模态-可暂时不使用
}

void selfMessageBox::resizeEvent(QResizeEvent *event)
{
    bgWidget->resize(this->size());
}

bool selfMessageBox::event(QEvent *event)
{
    if (!parent()) {
        return QWidget::event(event);
    }
    switch (event->type())
    {
        case QEvent::ParentChange:
        case QEvent::MouseButtonPress:
        {
            m_pokbutton->installEventFilter(this);
            m_pcancelbutton->installEventFilter(this);
            break;
        }
        case QEvent::ParentAboutToChange:
        case QEvent::MouseButtonRelease:
        {
            m_pokbutton->removeEventFilter(this);
            m_pcancelbutton->removeEventFilter(this);
            break;
        }
        default:
            break;
    }
    return QWidget::event(event);
}

bool selfMessageBox::eventFilter(QObject *obj, QEvent *event)
{
     if (event->type() == QEvent::MouseButtonPress)
     {
         QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
         if (obj == m_pokbutton && mouseEvent->buttons() & Qt::LeftButton)
         {
             emit ButtonClicked(1); // 发送信号,携带参数1
             qDebug("\033[31m [APP][func:%s] [line:%d] lgq okbutton-1\033[0m\n",__func__,__LINE__);
         }
         else if(obj == m_pcancelbutton && mouseEvent->buttons() & Qt::LeftButton)
         {
             emit ButtonClicked(0); // 发送信号,携带参数1
             qDebug("\033[31m [APP][func:%s] [line:%d] lgq m_pcancelbutton-1\033[0m\n",__func__,__LINE__);
         }
     }
    return QWidget::eventFilter(obj, event);
}

void selfMessageBox::on_okbutton()
{
    /* 效果同eventFilter事件中的MouseButtonPress,但是需要添加事件过滤函数才可 */
    //qDebug("\033[31m [APP][func:%s] [line:%d] lgq okbutton-1.1\033[0m\n",__func__,__LINE__);
    //this->hide(); // 隐藏当前窗口
    //emit ButtonClicked(1); // 发送信号,携带参数1
}
void selfMessageBox::paintEvent(QPaintEvent *event)
{
    bgWidget->setStyleSheet("background-color:"+defaultColor+";border-radius:9px;");

    update();
}

void selfMessageBox::mousePressEvent(QMouseEvent *event)
{
    bgWidget->setStyleSheet("background-color:"+pressedColor+";border-radius:9px;");
    mousePressed = true;
}

void selfMessageBox::mouseReleaseEvent(QMouseEvent *event)
{
    bgWidget->setStyleSheet("background-color:"+defaultColor+";border-radius:9px;");
    if(mousePressed)
        mousePressed = false;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扳手的海角

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值