0

我刚刚开始特别学习 C++ 和 Qt 框架,我已经遇到了问题。问题是如何创建和显示不仅是字符串而是对象的数据,以及我可以访问和显示哪些属性。例如,我有一个员工列表,我想显示一个如下所示的列表:

---------------------
John Smith
Salary: 50,230
---------------------
Max Mustermann
Salary: 67,000
---------------------

目标是列表中的每个项目都是可点击的,并打开一个包含详细信息的新窗口。此外,重要的部分是我可以为属性设置不同的样式。

4

1 回答 1

1

Qt 为我们提供了模型和视图框架,它非常灵活。您可以通过“模型”保存数据,通过“视图”显示“模型”的数据,并通过“委托”确定如何播放数据

c++的代码有点冗长,所以我使用文档中的qml来表达想法

    import QtQuick 2.1
import QtQuick.Window 2.1
import QtQuick.Controls 1.0

Rectangle {
    width: 640; height: 480

    //the new window
    Window{
        id: newWindow
        width: 480; height:240      

        property string name: ""
        property string salaryOne: ""
        property string salaryTwo: ""

        Rectangle{
            anchors.fill: parent

            Text{
                id: theText
                width:width; height: contentHeight
                text: newWindow.name + "\nSalaryOne : " + newWindow.salaryOne + "\nSalaryTwo : " + newWindow.salaryTwo
            }

            Button {
                id: closeWindowButton
                anchors.centerIn: parent
                text:"Close"
                width: 98
                tooltip:"Press me, to close this window again"
                onClicked: newWindow.visible = false
            }
        }
    }

    ListModel {
        id: salaryModel
        ListElement {
            name: "John Smith"
            SalaryOne: 50
            SalaryTwo: 230
        }
        ListElement {
            name: "Max Mustermann"
            SalaryOne: 67
            SalaryTwo: 0
        }
    }

    //this is the delegate, determine the way you want to show the data
    Component {
        id: salaryDelegate
        Item {
            width: 180; height: 40
            Column {
                Text { text: name }
                Text { text: "Salary : " + SalaryOne + ", " + SalaryTwo }
            }

            MouseArea{
                anchors.fill: parent

                //set the value of the window and make it visible
                onClicked: {
                    newWindow.name = model.name
                    newWindow.salaryOne = model.SalaryOne
                    newWindow.salaryTwo = model.SalaryTwo
                    newWindow.visible = true                    

                    view.currentIndex = index                          
                }
            }
        }
    }

    ListView {
        id: view
        anchors.fill: parent
        model: salaryModel
        delegate: salaryDelegate
    }
}

您可以将窗口或 ListView 分成不同的 qml 文件,结合 c++、qml 和 javascript 的强大功能。像 qml 这样的声明性语言在处理 UI 方面非常好。

c++版本

#include <memory>

#include <QApplication>
#include <QListView>
#include <QSplitter>
#include <QStandardItemModel>

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

    QStandardItemModel model(2, 1);
    model.appendRow(new QStandardItem(QString("John Smith\nSalary: %1, %2\n").arg(50).arg(230)));
    model.appendRow(new QStandardItem(QString("Max Mustermann\nSalary: %1, ").arg(67) + QString("000\n")));

    QSplitter splitter;

    QListView *list = new QListView(&splitter);
    list->setModel(&model);

    splitter.addWidget(list);

    splitter.show();

    return a.exec();
}

根据您的需要增强它们,c++ 版本也支持委托。您可以封装 QListView 并在用户单击索引时打开一个新窗口(您需要 QItemSelectionModel 来检测您选择了哪个项目)。在您可以设计高度自定义的 UI 之前,您必须研究大量的模型和视图框架Qt。由于您的案例非常简单,因此默认的 QListView 和 QStandardItemModel 就足够了。

补充:如何检测你选择了哪个索引?

//the type of model_selected is QItemSelectionModel*
model_selected = list->selectionModel();

connect(model_selected, SIGNAL(selectionChanged(QItemSelection, QItemSelection)),
            this, SLOT(selection_changed(QItemSelection, QItemSelection)));


void imageWindow::selection_changed(QItemSelection, QItemSelection)
{
    //do what you want
}
于 2013-05-31T01:38:09.783 回答