QLayout的排版和使用

在Qt嵌入式中,QLayout类的使用是比较广的,以为如果使用了窗口的ui进行框架的设置,那就必然产生了很多不必要的代码量,对程序进行优化和启动就相对来说就比较慢。但是,直接使用ui的框架设置能够很好地直观地显示当前ui的美观性等,更加简单和快捷。但是,在嵌入式中,一些比较简单的ui界面,强烈建议是使用程序来进行描画和排版。本文讨论的就是这样的条件下,设置的ui界面。

QLayout派生了两个子类,分别是QVBoxLayout和QHBoxLayout这两个,现在我主要是建立一个这样的项目:查看一个文件的文件信息,包括路径,大小,读取时间,权限等

本文章使用了三个源文件和一个文件夹,main.cpp tabwidget.cpp和tabwidget.h,其中文件夹存放的是一张png格式的照片。

步骤:
1.在项目所在路径创建一个文件夹,必须命名为resource,将一张图片存放在该文件夹中;
2.右击项目名称--》添加新文件--》Qt--》Qt Resource File--》确认后输入名称(这里作者设置为image)--》添加前缀(左下角)--》前缀那更改为image--》
  添加文件(添加前缀选项那里)--》加进来之后点击图片,左下键创建别名为open,如下图所示


3.tabwidget.h的内容如下:
#ifndef TABWIDGET_H
#define TABWIDGET_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
class QLabel;
class QCheckBox;
class QTabWidget;
class QString;
class QFileInfo;
QT_END_NAMESPACE

namespace Ui {
class TabWidget;
}

class TabWidget : public QMainWindow
{
    Q_OBJECT

public:
    explicit TabWidget(QWidget *parent = 0);
    ~TabWidget();

public slots:
    void getAttribution(bool);

private:
    QLabel *pathNameLabel;
    QLabel *pathValLabel;
    QLabel *sizeLabel;
    QLabel *sizeValLabel;
    QLabel *lastReadTimeLabel;
    QLabel *lastReadTimeValLabel;
    QLabel *lastModifiedLabel;
    QLabel *lastModifiedValLabel;

    QCheckBox *readable;
    QCheckBox *writeable;
    QCheckBox *executable;

    QLabel *owerLabel;
    QLabel *owerValLabel;

    QLabel *groupLabel;
    QLabel *groupValLabel;

    QTabWidget *tabWidget;

    QString filePath;

private:
    void getGenerMode(const QFileInfo &);
    void getPermissionMode(const QFileInfo &);

private:
    Ui::TabWidget *ui;
};

#endif // TABWIDGET_H
相对应的tabwidget.cpp内容如下:
#include "tabwidget.h"
#include "ui_tabwidget.h"
#include <QToolBar>
#include <QAction>
#include <QMainWindow>
#include <QLabel>
#include <QVBoxLayout>
#include <QGroupBox>
#include <QCheckBox>
#include <QString>
#include <QFileDialog>
#include <QFileInfo>
#include <QDateTime>


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

    this->resize(700,350);
    this->setMaximumSize(700,350);
    this->setMinimumSize(700,350);

    QToolBar *openBar = addToolBar(tr("打开"));
    QAction *action = new QAction(QIcon(":image/open"),tr("文件属性"),this);
    connect(action,SIGNAL(triggered(bool)),this,SLOT(getAttribution(bool)));
    openBar->addAction(action);

    pathNameLabel = new QLabel(tr("路径"));
    pathValLabel  = new QLabel();
    pathValLabel->setFrameStyle(QFrame::Panel|QFrame::Sunken);

    sizeLabel = new QLabel(tr("大小"));
    sizeValLabel = new QLabel();
    sizeValLabel->setFrameStyle(QFrame::Panel|QFrame::Sunken);

    lastReadTimeLabel = new QLabel(tr("上次最后读取时间"));
    lastReadTimeValLabel = new QLabel();
    lastReadTimeValLabel->setFrameStyle(QFrame::Panel|QFrame::Sunken);

    lastModifiedLabel = new QLabel(tr("最后更新时间"));
    lastModifiedValLabel = new QLabel();
    lastModifiedValLabel->setFrameStyle(QFrame::Panel|QFrame::Sunken);

    /* 加进组显示的步骤
     * 1.使用QVBoxLayout进行垂直排好版 addWidget()
     * 2.使用QGroupBox把上面排版好的对象铺好 setLayout()
     * 3.使用QVBoxLayo再次将上面的组进行垂直排版 addWidget(),(将组进行排版)
     * 4.使用QWidget将第三部弄好的排版,直接在窗口上显示
    */

    /*常规*/
    /* 1.使用QVBoxLayout进行垂直排好版 addWidget() */
    QVBoxLayout *generlarLayout = new QVBoxLayout;
    generlarLayout->addWidget(pathNameLabel);
    generlarLayout->addWidget(pathValLabel);
    generlarLayout->addWidget(sizeLabel);
    generlarLayout->addWidget(sizeValLabel);
    generlarLayout->addWidget(lastReadTimeLabel);
    generlarLayout->addWidget(lastReadTimeValLabel);
    generlarLayout->addWidget(lastModifiedLabel);
    generlarLayout->addWidget(lastModifiedValLabel);


    /* 2.使用QGroupBox把上面排版好的对象铺好 setLayout() */
    QGroupBox *generlarGroupLayout = new QGroupBox(tr("文件信息"));
    generlarGroupLayout->setLayout(generlarLayout);

    /* 3.使用QVBoxLayo再次将上面的组进行垂直排版 addWidget(),(将组进行排版) */
    QVBoxLayout *generlar = new QVBoxLayout;
    generlar->addWidget(generlarGroupLayout);
    generlar->addStretch(1);

    /* 4.使用QWidget将第三部弄好的排版,直接在窗口上显示 */
    QWidget *generTabWidget = new QWidget;
    generTabWidget->setLayout(generlar);


    /*权限*/
    readable = new QCheckBox(tr("读"));
    writeable = new QCheckBox(tr("写"));
    executable = new QCheckBox(tr("执行"));

    owerLabel = new QLabel(tr("所有者"));
    owerValLabel = new QLabel();
    owerValLabel->setFrameStyle(QFrame::Panel|QFrame::Sunken);

    groupLabel = new QLabel(tr("组"));
    groupValLabel = new QLabel();
    groupValLabel->setFrameStyle(QFrame::Panel|QFrame::Sunken);

    /* 1.QVBoxLayout垂直排版 */
    QVBoxLayout *permissionGroupLayout = new QVBoxLayout;
    permissionGroupLayout->addWidget(readable);
    permissionGroupLayout->addWidget(writeable);
    permissionGroupLayout->addWidget(executable);

    QVBoxLayout *owerGroupLayout = new QVBoxLayout;
    owerGroupLayout->addWidget(owerLabel);
    owerGroupLayout->addWidget(owerValLabel);
    owerGroupLayout->addWidget(groupLabel);
    owerGroupLayout->addWidget(groupValLabel);

    /* 2.使用QGroupBox将上述的加进组 */
    QGroupBox *permissionGroup = new QGroupBox(tr("权限"));
    permissionGroup->setLayout(permissionGroupLayout);

    QGroupBox *owerGroup = new QGroupBox(tr("文件属性"));
    owerGroup->setLayout(owerGroupLayout);

    /* 3.再次使用QVBoxLayout将组垂直排版(将组进行排版) */
    QVBoxLayout *permissionLayout = new QVBoxLayout;
    permissionLayout->addWidget(permissionGroup);
    permissionLayout->addWidget(owerGroup);
    permissionLayout->addStretch(1);


    /* 4.使用QWidget将第三部弄好的排版,直接在窗口上显示 */
    QWidget *permissionTabWidget = new QWidget();
    permissionTabWidget->setLayout(permissionLayout);


    /* 5.使用QTabWidget进行布局为table窗口 */
    tabWidget = new QTabWidget();
    tabWidget->addTab(generTabWidget,tr("常规"));
    tabWidget->addTab(permissionTabWidget,tr("权限"));
    tabWidget->setTabPosition(QTabWidget::South);

    /* 6.设置中心部件,这样就可以显示上述的设置了,否则不会显示上面程序的设计 */
    this->setCentralWidget(tabWidget);
}

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

void TabWidget::getAttribution(bool)
{
    filePath = QFileDialog::getOpenFileName(this,tr("打开文件"),"./","C++ file(*.cpp)");
    if(filePath.isEmpty())
        return;

    QFileInfo fileInfo(filePath);

    getGenerMode(fileInfo);
    getPermissionMode(fileInfo);
}

#include <QDebug>

void TabWidget::getGenerMode(const QFileInfo &info)
{
    qDebug()<<this->width()<<","<<this->height();
    pathValLabel->setText(info.absoluteFilePath());
    qlonglong size = info.size() / 1024;
    sizeValLabel->setText(tr("%1").arg(size));
    lastReadTimeValLabel->setText(info.lastRead().toString());
    lastModifiedValLabel->setText(info.lastModified().toString());
}

void TabWidget::getPermissionMode(const QFileInfo &info)
{
    if(info.isReadable())
        readable->setChecked(true);
    if(info.isWritable())
        writeable->setChecked(true);
    if(info.isExecutable())
        executable->setChecked(true);

    owerValLabel->setText(info.owner());
    groupValLabel->setText(info.group());
}



main.cpp内容如下
#include "tabwidget.h"
#include <QApplication>
#include <QTextCodec>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
    TabWidget w;
    w.show();

    return a.exec();
}

效果如下:






评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值