`
YANFAN0916
  • 浏览: 30250 次
文章分类
社区版块
存档分类
最新评论

Driver.cpp

 
阅读更多

#include "driver.h"

#include "uic.h"

#include "ui4.h"

#include <QtCore/QRegExp>

#include <QtCore/QFileInfo>

#include <QtCore/QDebug>

QT_BEGIN_NAMESPACE

Driver::Driver()

: m_stdout(stdout, QFile::WriteOnly | QFile::Text)

{

m_output = &m_stdout;

}

Driver::~Driver()

{

}

QString Driver::findOrInsertWidget(DomWidget *ui_widget)

{

if (!m_widgets.contains(ui_widget))

m_widgets.insert(ui_widget, unique(ui_widget->attributeName(), ui_widget->attributeClass()));

return m_widgets.value(ui_widget);

}

QString Driver::findOrInsertSpacer(DomSpacer *ui_spacer)

{

if (!m_spacers.contains(ui_spacer)) {

const QString name = ui_spacer->hasAttributeName() ? ui_spacer->attributeName() : QString();

m_spacers.insert(ui_spacer, unique(name, QLatin1String("QSpacerItem")));

}

return m_spacers.value(ui_spacer);

}

QString Driver::findOrInsertLayout(DomLayout *ui_layout)

{

if (!m_layouts.contains(ui_layout)) {

const QString name = ui_layout->hasAttributeName() ? ui_layout->attributeName() : QString();

m_layouts.insert(ui_layout, unique(name, ui_layout->attributeClass()));

}

return m_layouts.value(ui_layout);

}

QString Driver::findOrInsertLayoutItem(DomLayoutItem *ui_layoutItem)

{

switch (ui_layoutItem->kind()) {

case DomLayoutItem::Widget:

return findOrInsertWidget(ui_layoutItem->elementWidget());

case DomLayoutItem::Spacer:

return findOrInsertSpacer(ui_layoutItem->elementSpacer());

case DomLayoutItem::Layout:

return findOrInsertLayout(ui_layoutItem->elementLayout());

case DomLayoutItem::Unknown:

break;

}

Q_ASSERT( 0 );

return QString();

}

QString Driver::findOrInsertActionGroup(DomActionGroup *ui_group)

{

if (!m_actionGroups.contains(ui_group))

m_actionGroups.insert(ui_group, unique(ui_group->attributeName(), QLatin1String("QActionGroup")));

return m_actionGroups.value(ui_group);

}

QString Driver::findOrInsertAction(DomAction *ui_action)

{

if (!m_actions.contains(ui_action))

m_actions.insert(ui_action, unique(ui_action->attributeName(), QLatin1String("QAction")));

return m_actions.value(ui_action);

}

QString Driver::findOrInsertButtonGroup(const DomButtonGroup *ui_group)

{

ButtonGroupNameHash::iterator it = m_buttonGroups.find(ui_group);

if (it == m_buttonGroups.end())

it = m_buttonGroups.insert(ui_group, unique(ui_group->attributeName(), QLatin1String("QButtonGroup")));

return it.value();

}

// Find a group by its non-uniqified name

const DomButtonGroup *Driver::findButtonGroup(const QString &attributeName) const

{

const ButtonGroupNameHash::const_iterator cend = m_buttonGroups.constEnd();

for (ButtonGroupNameHash::const_iterator it = m_buttonGroups.constBegin(); it != cend; ++it)

if (it.key()->attributeName() == attributeName)

return it.key();

return 0;

}

QString Driver::findOrInsertName(const QString &name)

{

return unique(name);

}

QString Driver::normalizedName(const QString &name)

{

QString result = name;

QChar *data = result.data();

for (int i = name.size(); --i >= 0; ++data) {

if (!data->isLetterOrNumber())

*data = QLatin1Char('_');

}

return result;

}

QString Driver::unique(const QString &instanceName, const QString &className)

{

QString name;

bool alreadyUsed = false;

if (instanceName.size()) {

int id = 1;

name = instanceName;

name = normalizedName(name);

QString base = name;

while (m_nameRepository.contains(name)) {

alreadyUsed = true;

name = base + QString::number(id++);

}

} else if (className.size()) {

name = unique(qtify(className));

} else {

name = unique(QLatin1String("var"));

}

if (alreadyUsed && className.size()) {

fprintf(stderr, "%s: Warning: The name '%s' (%s) is already in use, defaulting to '%s'./n",

qPrintable(m_option.messagePrefix()),

qPrintable(instanceName), qPrintable(className),

qPrintable(name));

}

m_nameRepository.insert(name, true);

return name;

}

QString Driver::qtify(const QString &name)

{

QString qname = name;

if (qname.at(0) == QLatin1Char('Q') || qname.at(0) == QLatin1Char('K'))

qname = qname.mid(1);

int i=0;

while (i < qname.length()) {

if (qname.at(i).toLower() != qname.at(i))

qname[i] = qname.at(i).toLower();

else

break;

++i;

}

return qname;

}

static bool isAnsiCCharacter(const QChar& c)

{

return (c.toUpper() >= QLatin1Char('A') && c.toUpper() <= QLatin1Char('Z'))

|| c.isDigit() || c == QLatin1Char('_');

}

QString Driver::headerFileName() const

{

QString name = m_option.outputFile;

if (name.isEmpty()) {

name = QLatin1String("ui_"); // ### use ui_ as prefix.

name.append(m_option.inputFile);

}

return headerFileName(name);

}

QString Driver::headerFileName(const QString &fileName)

{

if (fileName.isEmpty())

return headerFileName(QLatin1String("noname"));

QFileInfo info(fileName);

QString baseName = info.baseName();

// Transform into a valid C++ identifier

if (!baseName.isEmpty() && baseName.at(0).isDigit())

baseName.prepend(QLatin1Char('_'));

for (int i = 0; i < baseName.size(); ++i) {

QChar c = baseName.at(i);

if (!isAnsiCCharacter(c)) {

// Replace character by its unicode value

QString hex = QString::number(c.unicode(), 16);

baseName.replace(i, 1, QLatin1Char('_') + hex + QLatin1Char('_'));

i += hex.size() + 1;

}

}

return baseName.toUpper() + QLatin1String("_H");

}

bool Driver::printDependencies(const QString &fileName)

{

Q_ASSERT(m_option.dependencies == true);

m_option.inputFile = fileName;

Uic tool(this);

return tool.printDependencies();

}

bool Driver::uic(const QString &fileName, DomUI *ui, QTextStream *out)

{

m_option.inputFile = fileName;

QTextStream *oldOutput = m_output;

m_output = out != 0 ? out : &m_stdout;

Uic tool(this);

bool rtn = false;

#ifdef QT_UIC_CPP_GENERATOR

rtn = tool.write(ui);

#else

Q_UNUSED(ui);

fprintf(stderr, "uic: option to generate cpp code not compiled in [%s:%d]/n",

__FILE__, __LINE__);

#endif

m_output = oldOutput;

return rtn;

}

bool Driver::uic(const QString &fileName, QTextStream *out)

{

QFile f;

if (fileName.isEmpty())

f.open(stdin, QIODevice::ReadOnly);

else {

f.setFileName(fileName);

if (!f.open(QIODevice::ReadOnly))

return false;

}

m_option.inputFile = fileName;

QTextStream *oldOutput = m_output;

bool deleteOutput = false;

if (out) {

m_output = out;

} else {

#ifdef Q_WS_WIN

// As one might also redirect the output to a file on win,

// we should not create the textstream with QFile::Text flag.

// The redirected file is opened in TextMode and this will

// result in broken line endings as writing will replace /n again.

m_output = new QTextStream(stdout, QIODevice::WriteOnly);

#else

m_output = new QTextStream(stdout, QIODevice::WriteOnly | QFile::Text);

#endif

deleteOutput = true;

}

Uic tool(this);

bool rtn = tool.write(&f);

f.close();

if (deleteOutput)

delete m_output;

m_output = oldOutput;

return rtn;

}

void Driver::reset()

{

Q_ASSERT( m_output == 0 );

m_option = Option();

m_output = 0;

m_problems.clear();

QStringList m_problems;

m_widgets.clear();

m_spacers.clear();

m_layouts.clear();

m_actionGroups.clear();

m_actions.clear();

m_nameRepository.clear();

m_pixmaps.clear();

}

void Driver::insertPixmap(const QString &pixmap)

{

m_pixmaps.insert(pixmap, true);

}

bool Driver::containsPixmap(const QString &pixmap) const

{

return m_pixmaps.contains(pixmap);

}

DomWidget *Driver::widgetByName(const QString &name) const

{

return m_widgets.key(name);

}

DomSpacer *Driver::spacerByName(const QString &name) const

{

return m_spacers.key(name);

}

DomLayout *Driver::layoutByName(const QString &name) const

{

return m_layouts.key(name);

}

DomActionGroup *Driver::actionGroupByName(const QString &name) const

{

return m_actionGroups.key(name);

}

DomAction *Driver::actionByName(const QString &name) const

{

return m_actions.key(name);

}

QT_END_NAMESPACE

分享到:
评论

相关推荐

    mlx90640-library.rar

    红外测温模块,MLX90640红外阵列传感器的底层驱动程序 MLX90640_API.cpp MLX90640_I2C_Driver.cpp MLX90640_SWI2C_Driver.cpp

    MANIFOLD 2-G开发 之 利用ROS话题编程实现UART1串口通讯.tar.gz

    MANIFOLD 2-G开发 之 利用ROS话题编程实现UART1串口通讯 博客对应的资源文件。...3、功能包hybrid_bot,包含chassis_cmd.cpp、chassis_driver.cpp及适用于Manifold2-G的CMakeLists.txt 和 package.xml配置文件。

    ASIO SDK 2.3.2

    asiodrvr.cpp - ASIO driver class base definition combase.h combase.cpp - COM base definitions (PC only) dllentry.cpp - DLL functions (PC only) register.cpp - driver self registration functionality ...

    U盘过滤驱动,实现U盘只读

    Files that comprise your driver: readme.txt Contains information shown here. sys\Usbfilter.cpp Driver class implementation. sys\Usbfilter.h Driver class header file. sys\Usbfilter.inf INF file...

    基于SystemC的数字锁相环(源代码)

    包括dpll.cpp dpll.h dpll_main.cpp driver.cpp driver.h,其中dpll.cpp、dpll.h定义和实现了DPLL的全部功能,driver.cpp、driver.h定义和实现了激励源输出波,dpll_main.cpp实现了模块实例化调用,输出VCD波形文件

    MLX90640驱动库API和C语言源代码已验证可用

    MLX90640驱动库API和C语言源代码已验证可用,MLX90640_API.cpp、MLX90640_I2C_Driver.cpp、MLX90640_SWI2C_Driver.cpp、MLX90640_API.h、MLX90640_I2C_Driver.h

    ad9361_driver.rar

    ad9361的驱动源码,基于c语言。 ad9361_synth_lut.h ad9361_gain_tables.h ad9361_filter_taps.h ad9361_device.h ad9361_client.h ad9361_device.cpp

    A盾电脑防护

    └─Driver │ AntiInlineHook.c │ AntiInlineHook.h │ Atapi.c │ Atapi.h │ buildchk_win7_x86.log │ buildchk_win7_x86.wrn │ Common.h │ Control.c │ Control.h │ DeleteFile.c │ ...

    C++简单练习.cpp

    Write a driver program to test class SavingsAccount. Instantiate two different objects of class SavingsAccount, saver1 and saver2, with balances of $2000.00 and $3000.00, respectively. Set the ...

    ur_hardware_interface.cpp

    ur_hardware_interface在ros中的robot_modern_driver驱动,修改过后可以编译成功。

    ros_serial.cpp

    融合sbg/imu_data和sbg/ekf_quat两个话题,以IMU_data话题名发布,消息类型为sensor_msge::imu

    usb_cam:V4L USB摄像机的ROS驱动程序

    usb_camV4L USB摄像机的ROS驱动程序该软件包特别基于V4L器件,而不仅仅是UVC。 有关完整文档,请参见 。 可在ROS Wiki上找到文件。执照usb_cam随BSD许可证一起发布。 有关完整的条款和条件,请参阅文件。...

    WinCE_UVC_Driver.rar_uvc_wince uvc_wince uvc driver

    wince uvc driver for wince with cpp code visual studio 2008 and reg file

    ProjectTest2

    g ++ -std = c ++ 11 miniGit.cpp driver.cpp ./a.out 库: iostream 流 细绳 去做: 添加有关miniGit方法的描述 确保插入,删除方法不会导致内存泄漏 继续处理驱动程序文件 找出写入中的.miniGit是什么 ...

    Bulirsch-Stoer Propagator/Integrat 或:Bulirsch-Stoer 算法的实现,用于数值轨道传播。-matlab开发

    描述: bulirsch-Stoer ... 请使用以下命令序列进行编译: &gt;&gt; mex BulirschMex.cpp bulirsch.cpp base_r.cpp t_dgls.cpp vmblock.cpp 有关使用 Burlisch-Stoer 与 ODE113 的示例轨道传播比较,请参阅 testDriver.m。

    绿色版PocketDOS 和 绿色版TC3.0

    DEF2 CPP - C++ example - another version of DEF.CPP DEF2 H - Header file for DEF.CPP DICTION CPP - C++ example program DICTION H - Header file for DICTION.CPP DYNPOINT CPP - C++ example file ...

    parallelport类

    If you are going to be using the CParallelPort code on Windows NT, Windows 2000, XP, 2003, Vista or 2008, then you will need to download and install the freeware DriverLINX PortIO driver. As a ...

    vedaldi2006-siftpp:SIFT++ 的分支,SIFT 检测器和描述符的轻量级 C++ 实现

    SIFT++ 前叉 这是一个分支, 检测器和描述符的轻量级 C++ 实现,由。 原始 README 可以在README.txt找到。...所有选项都可以在sift-driver.cpp看到; 所有关键点描述符都将保存到data/img3.key 。 执

    Cassandra cpp Driver 2.1

    C/C++ Driver 2.1 for Apache Cassandra Document August 13, 2015

    graphics:想象场景的简单渲染

    Renato Pereyra COMP 575 PA4 自述文件概述: 通过控制 ImageDriver.cpp 中的参数生成小样本场景输出: @see output.png @see output_antialiasing.png 注意:抗锯齿本质上是一种像素平滑处理,使场景中对象之间的...

Global site tag (gtag.js) - Google Analytics