构造函数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;
}