QT - 从.ui文件创建布局

时间:2012-11-29 19:29:24

标签: c++ qt user-interface

我的代码如下。我在数据库中有一些数据,我需要创建视图结构来显示它。我在Qt编程方面没有丰富的经验,我在PHP,HTML和CSS方面做了很多。我需要做一些像HTML一样的事情 - 当你有一个没有额外风格的盒子(比如div)时你会在里面放一些数据,这个div标签会显示里面的所有数据。但是通过以下代码,我只从文件中加载的小部件中获得了一部分数据。 MainWindow中GridLayout的行为类似于div style="max-width: 200px; max-height: 200px; overflow:hidden“。而且来自子文件的Layout元素具有相同的行为......

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "databasemanager.h"
#include "ycexception.h"
#include <QDebug>
#include <QSqlQuery>

#include <QtUiTools>

#include <QLabel>

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    createStructureFromDb();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::createStructureFromDb() {
    try {
        dbManager = new DatabaseManager();
    }
    catch(YCException e) {
        //TODO: show dialog with message
        qDebug() << e.what();
        exit(-1);
    }

    QSqlQuery groupsQuery = dbManager->getGroups();
    while(groupsQuery.next()) {
        Group group;
        group.setIdGroup(groupsQuery.value(0).toInt());
        group.setName(groupsQuery.value(1).toString());

        QUiLoader loader;
        QFile file(":/forms/group.ui");
        file.open(QFile::ReadOnly);
        QWidget *formWidget = loader.load(&file);
        file.close();
        (formWidget->findChild<QLabel*>("groupName"))->setText(group.getName());
        ui->gridLayout->addWidget(formWidget);

        QVBoxLayout* groupItems = formWidget->findChild<QVBoxLayout*>("groupItems");

        QSqlQuery cardsQuery = dbManager->getGroupCards(group.getIdGroup());
        while(cardsQuery.next()) {
            Card card;
            card.setIdCard(cardsQuery.value(0).toInt());
            card.setContent(cardsQuery.value(1).toString());
            card.setDueDate(cardsQuery.value(2).toString());
            card.setIdGroup(cardsQuery.value(3).toInt());

            group.addCard(card);

            QFile file(":/forms/card.ui");
            QWidget *cardWidget = loader.load(&file);
            file.close();

            (cardWidget->findChild<QLabel*>("contentLabel"))->setText(card.getContent());
            (cardWidget->findChild<QLabel*>("dueDateLabel"))->setText(card.getDueDate());

            groupItems->addWidget(cardWidget);
        }
        groups.insert(group.getIdGroup(), group);
    }

    ui->label->setText("really long textreally long textreally long textreally long textreally long textreally long textreally long textreally long textreally long textreally long textreally long text");
    this->layout()->activate();
}

1 个答案:

答案 0 :(得分:1)

对于像我这样对网络技术知之甚少的人来说,{p> overflow:hidden几乎是明确的(但我可以谷歌一下)。但是,说你想要滚动条更具表现力......我使用this page来理解你想要的东西。

所以,你想要的是:GridLayout 不是就像html的div一样。如果您希望滚动窗口小部件的内容,则必须将窗口小部件放在QScrollArea中,并将该滚动区域放在首先包含窗口小部件的GridLayout的单元格中。

更具体地说:

  • overflow:visiblenot possible
  • overflow:hidden:默认行为
  • overflow:scroll:使用QScrollArea
  • overflow:auto:使用QScrollArea
  • overflow:inherit:可能,但您需要编写相当多的代码才能执行此操作。此外,在精心设计的界面中无用