如何将Widget作为带有2列的QListWidget(带有一些约束)?

时间:2016-01-04 01:01:48

标签: c++ qt qt5

寻找:显示日期时间(灰色)和消息(红色表示错误,橙色表示警告... - >颜色数量未建立且必须灵活)。有时我们需要从消息中打开一个链接,打开的行为未建立(上下文菜单,简单点击 - > nevermind)

历史记录:1-我尝试使用html文字样式QTextBrowser - >在500行之后,它开始减慢应用程序,经过很多次,它会崩溃应用程序

2-我只用带有颜色的信息(不是日期时间)试过QListWidget,效果很好!

所以现在您明白我需要第二列,日期时间为灰色。

我的问题是:通过保持我喜欢的QListWidget风格,最简单,更有效的方法是什么。

我听说QTreeWidgetQTableWidget这样做了,但是对于那些小部件,我应该改变哪些最好的属性和属性? (总结:2列有2种不同的文字颜色,能够打开链接,QListWidget样式,滚动条总是在底部)

Windows,C ++,Qt 5

1 个答案:

答案 0 :(得分:0)

<强> MainWindow.h

#include <QMainWindow>
#include <QTreeWidget>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

public slots:
    void contextMenuRequest(const QPoint& pos);
    void openLink();

private:
    QTreeWidget* treeWidget;
};

<强> MainWindow.cpp

#include "mainwindow.h"
#include <QTreeWidgetItem>
#include <QStringList>
#include <QBrush>
#include <QAction>
#include <QMenu>
#include <QTime>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    treeWidget = new QTreeWidget(this);
    treeWidget->setGeometry(0, 0, 500, 500);
    treeWidget->setColumnCount(2);
    treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);

    connect(treeWidget, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(contextMenuRequest(QPoint)));

    QStringList headers;
    headers << "Date" << "Message";

    treeWidget->setHeaderLabels(headers);

    QTreeWidgetItem* errorItem = new QTreeWidgetItem();
    errorItem->setForeground(1, QBrush(QColor(255, 0, 0)));
    errorItem->setText(0, QTime::currentTime().toString());
    errorItem->setText(1, "error message");

    QTreeWidgetItem* warningItem = new QTreeWidgetItem();
    warningItem->setForeground(1, QBrush(QColor(255, 165, 0)));
    warningItem->setText(0, QTime::currentTime().toString());
    warningItem->setText(1, "warning message");

    treeWidget->addTopLevelItem(errorItem);
    treeWidget->addTopLevelItem(warningItem);

    for (int i = 0; i < 500; ++i)
    {
        QTreeWidgetItem* item;
        if (i % 2)
        {
            item = errorItem->clone();
            treeWidget->addTopLevelItem(item);
        }
        else
        {
            item = warningItem->clone();
            treeWidget->addTopLevelItem(item);
        }
        treeWidget->scrollToItem(item); //call after adding new item
    }

    resize(500, 500);
}

MainWindow::~MainWindow()
{

}

void MainWindow::contextMenuRequest(const QPoint& pos)
{
    QAction* openAction = new QAction("Open link", this);
    connect(openAction, SIGNAL(triggered()), this, SLOT(openLink()));

    QMenu menu;
    menu.addAction(openAction);

    menu.exec(mapToGlobal(pos));
}

void MainWindow::openLink()
{

}