Qt实战:简单通用的日志输出窗口

 

 

1 需求描述

设计一个类似于VS的日志输出窗口,点击某一行后内容能够自动展开,改变列宽时,选中行能够根据日志内容自动调整高度。同时提供一些常用的功能,例如复制、显示/隐藏列、日志分类显示、显示状态恢复等。

2 设计思路

这是一个实际项目中的一个控制台功能模块,用于显示日志信息,日志分为错误、警告、消息三大类;当时主要考虑实现要尽可能简单,所以优先想到了QTreeWidget、QTableWidget,使用QTreeWidget效果不大理想,主要是在选中行时和改变列宽时自动展开功能,在网上也查询了一些方案,都不理想。
后来发现Qt提供的一个接口QTableView::resizeRowToContents,好了,一切由此展开。

本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓

3 代码实现

这里主要是通过继承QTableWidget实现相关功能,为了实现一定美观,对TableWidget进行下简单的设置:

    setShowGrid(false);
    setFocusPolicy(Qt::NoFocus);
    setSelectionBehavior(QAbstractItemView::SelectRows);
    setSelectionMode(QAbstractItemView::SingleSelection);
    setEditTriggers(QAbstractItemView::NoEditTriggers);

    verticalHeader()->setDefaultSectionSize(DEFAULT_SECTION_SIZE);

首先,关闭网格显示;取消焦点,主要是屏蔽选中时的虚线框;
当然还要设置为单选行、不可编辑模式;同时设置了一个默认的行高。
同时呢,选中行时我们需要设置下选中样式,这里用QSS处理下:

QTableWidget {
    selection-background-color: #3399ff;
    selection-color: white;
}

当某一行被选中后我们需要处理一下:

void OutputWidget::onCurrentItemChanged(QTableWidgetItem *current, QTableWidgetItem *previous)
{
    if (previous)
    {
        setRowHeight(this->row(previous), DEFAULT_SECTION_SIZE);
    }

    resizeRowToContents(this->row(current));
}

这里设置一个默认的行高,当选中行改变时,上一次选中行恢复默认行高,当然也可以不处理,根据需求来。
当列宽改变时,我们也要做下处理:

    QHeaderView *header = horizontalHeader();
    header->setHighlightSections(false);
    connect(header, &QHeaderView::sectionResized, [=]() {
        QTableWidgetItem *currentItem = this->currentItem();
        if (!currentItem)
        {
            return;
        }
        resizeRowToContents(this->row(currentItem));
    });

这里主要通过监听QHeaderView的sectionResized信号实现。
好啦,按逻辑来讲到这里应该就可以了,但是使用过程中发现一点点问题,选中行改变时可能会串,额外处理下:

    connect(this, &OutputWidget::itemPressed, this, [=](QTableWidgetItem *item) {
        setCurrentItem(item);
    });

到此,基本功能就实现了,其他功能需要自行拓展,或者联系我定制开发,哈哈。

4 总结

大道至简,编程也一样,在满足需求的情况下,实现要尽可能简单,Qt提供的一些便捷类,例如QListWidget、QTreeWidget、QTableWidget等是能够满足绝大多数使用场景的。一般来说,真实的使用场景也并不会有多复杂,是我们想得太复杂而已。

代码下载:「链接」

文章转自博客园(Qt小罗):Qt实战13.简单通用的日志输出窗口 - Qt小罗 - 博客园

本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将Qt的工作台输出改到Qt界面输出,可以使用QTextEdit控件来显示输出信息。首先,需要在主窗口类中创建一个QTextEdit对象,用于显示输出信息。然后,使用qInstallMessageHandler函数来自定义消息处理流程,将输出信息重定向到QTextEdit控件中。 在主窗口类的构造函数中,创建一个QTextEdit对象,并设置其属性和大小。然后,使用qInstallMessageHandler函数来设置自定义的消息处理函数。在消息处理函数中,将输出信息追加到QTextEdit控件中。 以下是示例代码: ```cpp // 在主窗口类中定义一个QTextEdit对象 QTextEdit *debugEdit; // 自定义消息处理函数 void outputMessage(QtMsgType type, const QMessageLogContext &context, const QString &msg) { // 根据消息类型设置输出格式 QString output; switch (type) { case QtDebugMsg: output = QString("Debug: %1").arg(msg); break; case QtWarningMsg: output = QString("Warning: %1").arg(msg); break; case QtCriticalMsg: output = QString("Critical: %1").arg(msg); break; case QtFatalMsg: output = QString("Fatal: %1").arg(msg); break; default: break; } // 将输出信息追加到QTextEdit控件中 debugEdit->append(output); } // 在主窗口类的构造函数中设置QTextEdit控件和消息处理函数 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { // 创建QTextEdit对象 debugEdit = new QTextEdit(); debugEdit->setWindowTitle("调试窗口"); debugEdit->resize(500, 300); debugEdit->setAttribute(Qt::WA_QuitOnClose, false); debugEdit->hide(); // 设置自定义的消息处理函数 qInstallMessageHandler(outputMessage); } ``` 通过以上代码,你可以将Qt的工作台输出改到Qt界面输出,将输出信息显示在QTextEdit控件中。 #### 引用[.reference_title] - *1* *3* [QT 日志输出至控制台、控件、文件](https://blog.csdn.net/weixin_49569127/article/details/123201370)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [QT 学习笔记(六)](https://blog.csdn.net/weixin_45891612/article/details/128087543)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值