weixin_46813854 2024-06-03 16:15 采纳率: 0%
浏览 73

QT中tabidget请编写一段代码,实现显示报警消息列表的功能,并可查询历史。

QT中tabidget请编写一段代码,实现显示报警消息列表的功能,并可查询历史。

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-06-03 16:15
    关注

    引自免费微信小程序:皆我百晓生

    在Qt中,我们可以使用QTableWidget来创建一个表格来展示报警消息列表,并使用QLineEdit和QPushButton来实现查询功能。下面是一个简单的示例代码,展示了如何创建这样的界面以及处理查询事件。

    首先,确保已经包含了必要的头文件:

    #include <QApplication>
    #include <QWidget>
    #include <QGridLayout>
    #include <QTableView>
    #include <QAbstractTableModel>
    #include <QLineEdit>
    #include <QPushButton>
    #include <QSortFilterProxyModel>
    

    然后,我们定义一个模型类(继承自QAbstractTableModel),用于存储报警消息数据:

    class AlarmMessageModel : public QAbstractTableModel {
    public:
        AlarmMessageModel(QObject* parent = nullptr) : QAbstractTableModel(parent) {}
    
        int rowCount(const QModelIndex& parent = QModelIndex()) const override {
            return alarmMessages.size();
        }
    
        int columnCount(const QModelIndex& parent = QModelIndex()) const override {
            return 2;
        }
    
        QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override {
            if (role == Qt::DisplayRole && index.isValid()) {
                const auto& message = alarmMessages[index.row()];
                switch(index.column()) {
                    case 0: return message.timestamp.toString("yyyy-MM-dd HH:mm:ss");
                    case 1: return message.description;
                }
            }
            return QVariant();
        }
    
        void addAlarmMessage(const QString& timestamp, const QString& description) {
            beginInsertRows(QModelIndex(), rowCount(), rowCount());
            alarmMessages.append({timestamp, description});
            endInsertRows();
        }
    
    private:
        QVector<QPair<QString,QString>> alarmMessages;
    };
    

    接下来,我们需要一个过滤器模型(继承自QSortFilterProxyModel)来处理查询操作:

    class AlarmQueryProxyModel : public QSortFilterProxyModel {
    public:
        AlarmQueryProxyModel(QObject* parent = nullptr) : QSortFilterProxyModel(parent) {}
    
    protected:
        bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const override {
            const auto& model = static_cast<AlarmMessageModel*>(sourceModel());
            const auto& row = model->alarmMessages[source_row];
            return row.second.contains(filterRegExp(), Qt::CaseInsensitive);
        }
    };
    

    现在我们可以创建主窗口并添加相关控件:

    int main(int argc, char *argv[]) {
        QApplication app(argc, argv);
    
        QWidget window;
        QVBoxLayout layout(&window);
    
        // 创建表格
        QTableView tableView;
        AlarmMessageModel alarmModel;
        AlarmQueryProxyModel proxyModel;
        proxyModel.setSourceModel(&alarmModel);
        tableView.setModel(&proxyModel);
        layout.addWidget(&tableView);
    
        // 添加表头
        tableView横置横置Header()->setSectionResizeMode(0, QHeaderView::Stretch);
        tableView横置横置Header()->setSectionResizeMode(1, QHeaderView::ResizeToContents);
        tableView横置横置Header()->setLabelText(0, "时间");
        tableView横置横置Header()->setLabelText(1, "描述");
    
        // 查询框与按钮
        QLineEdit searchBox;
        QPushButton addButton{"添加"};
        addButton.clicked.connect([&]{
            auto timestamp = QTime::currentTime().toString("yyyy-MM-dd HH:mm:ss");
            auto text = searchBox.text();
            alarmModel.addAlarmMessage(timestamp, text);
            searchBox.clear();
        });
        layout.addRow(&searchBox, &addButton);
    
        window.show();
    
        return app.exec();
    }
    

    这个例子中,我们创建了一个QTableView来显示报警消息列表,一个QLineEdit供用户输入查询条件,以及一个QPushButton用来添加新的报警消息。当按下添加按钮时,会将查询框中的内容添加到模型中。查询功能由AlarmQueryProxyModel实现,它会根据用户的输入实时筛选出匹配的行。

    注意:为了方便阅读,我已将代码分割为几个部分。你需要在同一个源文件中包含所有这些部分。此外,记得在构建项目时链接相应的Qt库。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月3日