Qt实现消息列表以及显示


我们曾经用Qt的QListWidget控件实现了 模拟微信联系人列表,今天利用该控件实现一个比较简单的错误消息的汇总显示组件。

该组件默认隐藏,显示时在桌面的右下角弹出。比较符合一般软件的设计方案。因为是比较通用的错误消息的汇总中心,因此,对错误是不进行处理的,只做消息的显示。错误消息由谁创建则由谁关闭,实现良性的闭环。

先来看下整体的效果图。
在这里插入图片描述

效果是很丑的样子,已经尽力了。

1、消息内容

  • 消息的状态

    消息的状态显示为消息是否被阅读,我们使用给每条消息添加红色圆点来标记消息是否已阅。

在这里插入图片描述

  • 消息标题

    每条消息都应该有标题,并且标题能够清晰的反应该条错误的类型,比如:server disconnected.

  • 消息编码

    消息的编码应该是软件设计过程中不可缺少的部分,比如网站请求的错误编码:404、502这些,我们一眼就能够大概得知是什么错误。

  • 具体信息

    具体信息主要包含错误信息,详细描述错误。

  • 解决方案

    针对错误消息提出可行的解决方案

  • 时间

    错误出现的时间,这个元素是必不可少的。

为了方便设计,我们采用了每条消息均是一个独立的个体,完全保存自己的所有信息,当被点击后,将自己信息反馈上来进行界面展示。这样方便管理,也方便开发。

enum SystemErrorType{
    SYSTEM_INIT = 0,	//消息错误码
    SERVICE_DISCONNECT
    ...
};
enum ErrorStatus{
    NOT_READ = 0,       //消息的两种状态
    HAVE_READ
};

下面是一个消息的实体,包含了消息所需要的基本信息,新增加了一个是否可由用户删除的标志。是因为,有些提示性的消息是可以阅后由用户直接关闭的。

struct ErrorInfo
{
    SystemErrorType code;
    QString info;
    QString solution;
    QDateTime time;
    bool deleted;
    ErrorInfo() : code(SYSTEM_INIT), info(), solution(), time(QDateTime::currentDateTime()), deleted(false)
    {

    }
};

具体的消息列表和消息体的实现不再进行赘述了,如果想看的话,可以看看前面的文章Qt实现模拟微信联系人列表。两者的实现是同样的道理。

2、消息的创建

int MessageCenter::pushError(const QString& strErrorName, const ErrorInfo& errInfo, bool isStick)
{
	//先创建一条消息
    auto pError = new MsgItem(this);
    pError->setErrorText(strErrorName);
    pError->setErrorInfo(errInfo);
    pError->setErrorStatus(NOT_READ);
    pError->setcleanBtnVisible(errInfo.deleted);
    pError->setMsgId(++m_nMsgId);

    auto pItem = new QListWidgetItem(ui->listWidget);
    pItem->setSizeHint(QSize(196, 40));

    //消息置顶
    if (isStick)
    {
        ui->listWidget->insertItem(1, pItem);
    }
    else
    {
        ui->listWidget->addItem(pItem);
    }
    ui->listWidget->setItemWidget(pItem, pError);
    m_mError.insert(m_nMsgId, pItem);//维护一份消息ID和消息体的关系,方便后续的消息的关闭
    //通知应用的主题,错误消息的数量改变,让应用主题进行自行变更
    emit signal_errorCount(ui->listWidget->count());
    if (!isVisible())
    {
        show();
    }
    if (errInfo.deleted)
    {
    	//如果是提示性消息,则需要显示删除按钮
        connect(pError, &MsgItem::signal_delete, this, &MessageCenter::slot_delete);
    }
    return m_nMsgId;	//返回消息ID,消息ID由创建者管理
}

3、消息关闭

消息关闭时,主要进行资源的管理和界面信息的清理。

void MessageCenter::closeError(int nMsgId)
{
    QListWidgetItem* pError = m_mError.value(nMsgId);
    if (m_pCurrentItem == pError)
    {
        m_pCurrentItem = Q_NULLPTR;
    }
    QListWidgetItem *pItem = ui->listWidget->takeItem(ui->listWidget->row(pError));
    m_mError.remove(nMsgId);
    resetPage();
    delete pItem;
    pItem = Q_NULLPTR;
    if (m_mError.isEmpty())	//如果错误消息为空,则隐藏界面
    {
        hide();
        ui->widgetInfo->setVisible(false);
    }
    emit signal_errorCount(ui->listWidget->count());
}

4、右下角显示

void MessageCenter::showEvent(QShowEvent*)
{
    QRect rect = QApplication::desktop()->availableGeometry();
    move(rect.width() - this->size().width() - 1, rect.height() - this->size().height() - 1);
}

代码测试

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt实现消息滚动显示可以使用QScrollBar和QLabel来实现。首先,我们需要创建一个水平滚动条和一个标签,用于显示消息。然后,我们将滚动条和标签放置在一个垂直布局的QWidget上。 首先,我们在Qt Designer中创建一个新的窗口,将一个水平滚动条(QScrollBar)和一个标签(QLabel)放置在垂直布局(QVBoxLayout)的QWidget上。将标签设置为只读,以便在显示消息时禁用编辑。 在代码中,我们首先创建一个QMainWindow对象来承载我们在Qt Designer中设计的窗口。然后,我们使用QScrollBar和QLabel的指针来获取对应的实例,以便在后续代码中使用。 接下来,我们需要为滚动条设置最小值、最大值和步长,以便用于控制滚动条的滑动。我们可以使用setMinimum、setMaximum和setSingleStep函数来设置这些值。 然后,我们需要创建一个QStringList来保存要显示消息。可以使用append函数向QStringList中添加新的消息。 随后,我们需要定义一个函数来处理滚动条的值变化事件(valueChanged信号)。在这个函数中,我们可以获取滚动条的当前值,并将其用作消息列表的索引,以便从中获取要显示消息。然后,我们将这个消息设置为标签的文本。 最后,我们需要将滚动条的valueChanged信号连接到我们刚刚创建的槽函数中。这样,当滚动条的值发生变化时,槽函数将被触发,更新标签的文本。 以上是一个简单的方法来实现Qt中的消息滚动显示,但具体的实现方式可能因需求而有所不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值