无法在放置在另一个 QWidget 中的 QWidget 中显示树 (QTreeView)

Cannot display a tree (QTreeView) inside a QWidget placed inside another QWidget

本文关键字:QWidget 显示 QTreeView 中的 另一个      更新时间:2023-10-16

我对包含树的QWidget(QTreeView)有问题:如果它是单独创建为小部件,我可以显示它,如果它是另一个更高级别小部件的子小部件,我不能做同样的事情。在第二种情况下,我得到的是一个没有树的空小部件。

这有效:

QApplication testApp(argc, argv);
MyTree myTree;
testApp.exec();

这不起作用:

class MainWindow : public QMainWindow
{
    Q_OBJECT
    QSplitter *spl1, *spl2;
    QMdiArea *mdiArea;
    QTableWidget *other;
public:
    MainWindow();
    void LoadTree();
    MyTree *myTree;
};

MainWindow::MainWindow(QWidget *_parent)
    : QMainWindow(_parent), myTree(0)
{
    mdiArea = new QMdiArea;
    other = new QTableWidget;
    spl1 = new QSplitter(Qt::Vertical, this);
    spl1->addWidget(mdiArea);
    spl1->addWidget(other);
    LoadTree();
    spl2 = new QSplitter(Qt::Horizontal, this);
    spl2->addWidget(myTree);
    spl2->addWidget(spl1);
    setCentralWidget(spl2);
}
void MainWindow::LoadTree()
{
    myTree = new MyTree(this);
}

以下是两种情况共有的代码(应该没问题):

class MyTree : public QWidget
{
    Q_OBJECT
public:
    explicit MyTree(QWidget *_parent = 0);
    int RefreshTree();
private slots:
    void HandleTreeWidgetEvent(QModelIndex);
private:
    QWidget *parent;
    QTreeView *pjrTree;
    QTreeView *GetNewTree();
};
MyTree::MyTree(QWidget *_parent) :
    QWidget(_parent),
    parent(_parent)
{
    pjrTree = GetNewTree();
    if(pjrTree) {
        if(parent == 0)
            pjrTree->show();
    }
    else {
        // Never gets here
    }
}
QTreeView* MyTree::GetNewTree()
{
    QFileSystemModel *model = new QFileSystemModel;
    model->setReadOnly(true);
    model->setRootPath("/my/path/");
    QTreeView* pjrTree = new QTreeView;
    pjrTree->setModel(model);
    pjrTree->setRootIndex(model->index("/my/path/"));
    QModelIndex index;
    index = model->index(4, 1);     // temp values - no effect
    return pjrTree;
}

树视图是唯一不显示的小部件吗?我建议在实例化树时,将它作为父窗口而不是主窗口包含在其中的拆分器传递。

QTreeView 派生类 MyTree ,而不是将指向 QTreeView 的指针作为成员变量,解决了我的问题。