在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();
}
效果如下: