gpt4 book ai didi

qt - 关于在Qt中输入错误的弹出通知

转载 作者:行者123 更新时间:2023-12-03 07:32:20 25 4
gpt4 key购买 nike

我有一个对话框,其中包含例如QLineEdit,当QLineEdit中的文本错误以及为什么错误时,我想通知用户。我想在QLineEdit旁边显示一个小弹出窗口,例如说“此字符串没有元音”。我尝试了QToolTip::showText,但这只是一个临时弹出窗口,在鼠标移动后消失了。我当然不想要任何QMessageBox。正确的方法是什么?

最佳答案

我喜欢这个问题,我认为这是一个特殊的问题,我花了一些时间来构建我认为您想要的通知弹出窗口。我用一个简单的QPushButton构建了一个测试应用程序,它显示了弹出窗口。您始终可以根据收到的信号showhide

我希望这会有所帮助,我给它带来了很多乐趣:-D

这是最终结果:

这是示例项目:

popup.pro:

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = Popup
TEMPLATE = app


SOURCES += main.cpp\
widget.cpp \
popupwidget.cpp

HEADERS += widget.h \
popupwidget.h

FORMS += widget.ui

popupwidget.h:
#ifndef POPUPWIDGET_H
#define POPUPWIDGET_H

#include <QWidget>
#include <QLabel>
#include <QGridLayout>
#include <QPropertyAnimation>

class PopUpWidget : public QWidget
{
Q_OBJECT

Q_PROPERTY(float popupOpacity READ getPopupOpacity WRITE setPopupOpacity)

void setPopupOpacity(float opacity);
float getPopupOpacity() const;

public:
explicit PopUpWidget(QWidget *parent = 0);

protected:
void paintEvent(QPaintEvent *e);

public slots:
void setPopupText(const QString& text);
void show();

private:
QLabel label;
QGridLayout layout;
QPropertyAnimation animation;
float popupOpacity;
};

#endif // POPUPWIDGET_H

popupwidget.cpp:
#include "popupwidget.h"

#include <QPainter>

PopUpWidget::PopUpWidget(QWidget *parent) :
QWidget(parent)
{
resize(200, 50);

setWindowFlags(Qt::FramelessWindowHint | Qt::Tool);
setAttribute(Qt::WA_TranslucentBackground);
setAttribute(Qt::WA_ShowWithoutActivating);

animation.setTargetObject(this);
animation.setPropertyName("popupOpacity");
animation.setDuration(150);

label.setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);

layout.addWidget(&label, 0, 0);
setLayout(&layout);
}

void PopUpWidget::paintEvent(QPaintEvent *e)
{
Q_UNUSED(e)

// Draw the popup here
// You can always pick an image and use drawPixmap to
// draw it in order to make things simpler

QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);

// Prepare the popup dimensions
QRect roundedRectDimensions;
roundedRectDimensions.setX(rect().x() + 5);
roundedRectDimensions.setY(rect().y() + 5);
roundedRectDimensions.setWidth(rect().width() - 10);
roundedRectDimensions.setHeight(rect().height() - 10);

painter.setBrush(QBrush(Qt::lightGray));

QPen pen;
pen.setColor(Qt::gray);
pen.setWidth(3);
painter.setPen(pen);

// Draw the popup body
painter.drawRoundedRect(roundedRectDimensions, 15, 15);

painter.setPen(Qt::NoPen);
painter.setBrush(QBrush(Qt::gray));

// Draw the popup pointer
const QPointF points[3] = {
QPoint(roundedRectDimensions.x(), roundedRectDimensions.height() / 2 - 5 + 3),
QPoint(roundedRectDimensions.x(), roundedRectDimensions.height() / 2 + 5 + 3),
QPoint(roundedRectDimensions.x() - 5, roundedRectDimensions.height() / 2 + 3)
};

painter.drawPolygon(points, 3);
}

void PopUpWidget::setPopupText(const QString &text)
{
label.setText(text);
}

void PopUpWidget::show()
{
setWindowOpacity(0.0);

animation.setStartValue(0.0);
animation.setEndValue(1.0);

QWidget::show();

animation.start();
}

void PopUpWidget::setPopupOpacity(float opacity)
{
popupOpacity = opacity;

setWindowOpacity(opacity);
}

float PopUpWidget::getPopupOpacity() const
{
return popupOpacity;
}

widget.h:
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

#include "popupwidget.h"

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
Q_OBJECT

public:
explicit Widget(QWidget *parent = 0);
~Widget();

private slots:
void onPopUpButtonClicked();

private:
Ui::Widget *ui;
PopUpWidget *popUp;
};

#endif // WIDGET_H

widget.cpp:
#include "widget.h"
#include "ui_widget.h"


#include <QDebug>

Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);

popUp = new PopUpWidget(this);

connect(ui->popUpButton, SIGNAL(clicked()),
SLOT(onPopUpButtonClicked()));
}

Widget::~Widget()
{
delete ui;
}

void Widget::onPopUpButtonClicked()
{
popUp->setPopupText("Example popup notification...");

const QPoint globalPos = ui->popUpButton->mapFromGlobal(QPoint(0, 0));
const int posX = -globalPos.x();
const int posY = -globalPos.y();

popUp->setGeometry(posX + ui->popUpButton->width(),
posY - ui->popUpButton->height() / 2,
popUp->width(),
popUp->height());

popUp->show();
}

widget.ui:
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Widget</class>
<widget class="QWidget" name="Widget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>223</width>
<height>128</height>
</rect>
</property>
<property name="windowTitle">
<string>Widget</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QPushButton" name="popUpButton">
<property name="text">
<string>Pop notification!</string>
</property>
</widget>
</item>
</layout>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources/>
<connections/>
</ui>

main.cpp:
#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);

Widget w;
w.show();

return a.exec();
}

关于qt - 关于在Qt中输入错误的弹出通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27025347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com