存档在 2014年3月

解决 github 样式资源域名被墙方法

2014年3月31日

最近上github慢的要死,等了半天后老是css没加载,严重影响使用,解决办法是修改hosts,指明IP地址

  1. Windows下的修改方法
    修改C:\Windows\System32\drivers\etc\hosts,增加如下两行

    185.31.17.184 github.global.ssl.fastly.net
    185.31.16.184 github-camo.global.ssl.fastly.net

    如果权限不够,在hosts文件上右键属性->安全,为登录用户授予修改权限。

  2. Linux下修改方法
    修改/etc/hosts,添加如1中的两行。 

自定义Model需要重新定义哪些虚函数

2014年3月30日

在模式(Model)中的每一个数据元素都有一个模式索引(ModelIndex,可以看做每个项的身份证,如图所示)和一系列称为角色(Roles)的属性。

modelindex-no-parent

  1. 根据跟QModeIndex返回行,即返回这个Model的总行数。
    virtual int rowCount(const QModelIndex &parent = QModelIndex()) const = 0;
  2. 根据跟QModeIndex返回列,即返回这个Model的总列数。
    virtual int columnCount(const QModelIndex &parent = QModelIndex()) const = 0;
  3. data。在界面需要更新的时候调用,返回一个项的任意角色的值。
    virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const = 0;
  4. headerData。当视图组装表头时使用。
        virtual QVariant headerData(int section, Qt::Orientation orientation,
                                    int role = Qt::DisplayRole) const;
  5. setData当用户编辑一个项时调用。
        virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
  6. flags函数。其中在flags函数中给相应的itme增加Qt::ItemIsEditable标记。
        virtual Qt::ItemFlags flags(const QModelIndex &index) const;
  7. index。在模型或者视图为一个特定的子项创建一个QModeIndex时调用。
        virtual QModelIndex index(int row, int column,
                                  const QModelIndex &parent = QModelIndex()) const = 0;
  8. parent。返回一个子项的父亲。
        virtual QModelIndex parent(const QModelIndex &child) const = 0;

参考文献:http://qt-project.org/doc/qt-5/QAbstractItemModel.html

git乱码相关问题解决

2014年3月29日

1.解决bash控制台ls命令中文文件名乱码

在git\etc\git-completion.bash文件中增加一行

alias ls='ls --show-control-chars --color=auto'

2.bash控制台git commit提交无法输入中文注释

修改git\etc\inputrc

set output-meta on
set convert-meta off

3.git log 命令中文注释乱码

修改git/etc/profile中增加一行

export LESSCHARSET=iso8859

4.解决gitk显示中文注释乱码

git config --global i18n.commitencoding ISO-8859
git config --global i18n.logoutputencoding ISO-8859

.gitignore 文件

2014年3月28日

.gitignore 配置文件用于配置不需要加入版本管理的文件,配置好该文件可以为我们的版本管理带来很大的便利,以下是个人对于配置 .gitignore 的一些心得。

1、配置语法:

  以斜杠“/”开头表示目录;
  以星号“*”通配多个字符;
  以问号“?”通配单个字符
  以方括号“[]”包含单个字符的匹配列表;
  以叹号“!”表示跟踪匹配到的文件或目录;

  此外,git 对于 .ignore 配置文件是按行从上到下进行规则匹配的,意味着如果前面的规则匹配的范围更大,则后面的规则将不会生效;

2、示例:

  (1)规则:fd1/*
     说明:忽略目录 fd1 下的全部内容;注意,不管是根目录下的 /fd1/ 目录,还是某个子目录 /child/fd1/ 目录,都会被忽略;
  (2)规则:/fd1/*
     说明:忽略根目录下的 /fd1/ 目录的全部内容;
  (3)规则:

/*
!.gitignore
!/fw/bin/
!/fw/sf/
说明:忽略全部内容,但是不忽略 .gitignore 文件、根目录下的 /fw/bin/ 和 /fw/sf/ 目录;

修正Mathtype公式位置出现偏移

2014年3月24日

现象与问题

1.word中的公式出现向上偏移现象
2.单倍行距时有问题

公式较少时解决办法

1.双击有问题的公式,点击“Format(格式)”,选择“Line Spacing(行间距)”,如果不是150修改成150,是150直接点”OK(确定)”

公式较多时解决办法

1.双击有问题的公式,点击“Format(格式)”,选择“Line Spacing(行间距)”,如果不是150修改成150,是150直接点”OK(确定)”
2.点击菜单栏的Preferences->”Equation Preferences->Save to file”后保存
3.接下来进行word全局格式化:
word全选文字(ctrl+A)—>选择MathType菜单栏->Format Equations–>MathType preference file:->选择刚才备份的文件->确定

sqlserver可以用sa登录,windows验证登录出错18456

2014年3月23日

问题

Windows身份验证方式不能够登录,使用sa可以登录。

解决步骤

第一种可能

1.使用sa登录sqlserver
2.右击服务器,选择“属性”
3.点击“安全性标签”
4.选择右边的“SQL Server和Windows身份验证模式”

第二种可能

1.使用sa登录sqlserver
2.点击左侧“安全性->登录名”,右键”新建登录名”
3.点击文本框右侧的“搜索”
4.在弹出的对话框中,输入windows的管理员名字后,点击“检查名称”确认正确

第三种可能

1.桌面“我的电脑”右键点击“管理”
2.在左侧找到“本地用户和组->用户”
3.在右侧找到”Administrator”,右键“属性”
4.在弹出的对话框中,去掉“账户已禁用”

确保已安装项目类型(.csproj)的应用程序的解决办法

2014年3月23日

vs打开一个解决方案时出错,如下图所示:
error01
可能是安装SQLServer 2005数据库了后导致的该文件关联应用不对。
解决方法:右键点击csproj结尾的文件,选择“属性”,“打开方式”,将其定位到vs的exe文件上,点击“确定”就可以了

QSetting详解

2014年3月18日

QSetting是一个平台无关的可以设置和读取应用程序设置的类,用户可能希望应用程序记住自己应用程序的设置,windows记录在注册表中,mac中记录在xml中,在unix中,缺乏标准,所以很多都记录在.ini文本文件中,QSetting的API都是基于QVariant的,允许保存很多类型的数据,例如QString,QRect,和QImage。

基本用法:

当创建一个QSetting对象时候,应该把公司或组织,还有应用程序的名字传递给构造函数,例如,如果应用程序叫做Star Runner,公司叫做MySoft,那么应该像下面这样构造对象

QSetting settings(“MySoft”,”Star Runner”);

QSetting的对象可以再堆或者栈上创建,构造和析构都非常快,如果在应用程序你在很多地方用QSetting,可以使用QCoreApplication::setOrganizationName()和QCoreApplication::setApplicationName()设置组织名和应用程序,然后使用QSetting的默认构造函数。

QCoreApplication::setOrganizationName("MySoft");

QCoreApplication::setOrganizationDomain("unix8.net");

 QCoreApplication::setApplicationName("softname");

     //...

QSettings settings;

这里我们也指定了组织的网络域名,使用QCoreApplication::setOrganizationDomain()。

QSetting由和值组成,使用QString指定键key的名字,使用QVariant来存储和key相关联的值,设定key,使用setValue(),例如

Setting.setValue(“editor/warpMargin”,68);

如果已经存在了同名的key,那么新的值会覆盖原来的值,获取setting的值使用value()函数

int margin=setting.value(“editor/warpMargin”).toInt();

如果没有指定的key,那么value()会返回一个Null QVariant,也可以为value()指定一个缺省的值,如下面

int margin=setting.value(“editor/warpMargin,80).toInt();

缺省值就是80,value()返回的值是一个QVariant,把他转换成int类型。

QVariant和GUI类型

因为QVariant是QtCore库的一部分,不能提供一个方便的函数转换成QColor,QImage和QPixmap,因为这些是QtGui的一部分,换句话说,没有toColor(),toImage(),toPixmap()等方法,但是我们可以使用qVariantValue()模板函数或者QVariant::value<templateT>来转换,他们是等价的,例如

QSettings settings("MySoft", "Star Runner");
QColor color = settings.value("DataPump/bgcolor").value<QColor>();

相反的转换过程是QVariant自动支持的,包括GUI相关类型,例如

QSettings settings("MySoft", "Star Runner");
QColor color = palette().background().color();
settings.setValue("DataPump/bgcolor", color);

QSetting语法

无论windows还是unix,使用“/”作为分隔符,而不是“\”,如果在一个地方指定了“text fonts”,就不要再其他地方指定“Text Fonts”,例如

     settings.setValue("mainwindow/size", win->size());
     settings.setValue("mainwindow/fullScreen", win->isFullScreen());
     settings.setValue("outputpanel/visible", panel->isVisible());

如果想设置子目录,也可以使用beginGroup()和endGroup()配合使用,如下

   settings.beginGroup("mainwindow");
     settings.setValue("size", win->size());
     settings.setValue("fullScreen", win->isFullScreen());
     settings.endGroup();

     settings.beginGroup("outputpanel");
     settings.setValue("visible", panel->isVisible());
     settings.endGroup();

效果和上面的一样,除了group之外,QSetting也支持array概念,详见beginReadArray()和beginWriteArray。如果有很多东西需要记录在setting中,可以使用arrays更简单一些,例如,你想保存一个变长的list,list中保存用户的name和password,可以用下面的代码

struct Login {
     QString userName;
     QString password;
 };
 QList<Login> logins;
 ...

 QSettings settings;
 settings.beginWriteArray("logins");
 for (int i = 0; i < logins.size(); ++i) {
     settings.setArrayIndex(i);
     settings.setValue("userName", list.at(i).userName);
     settings.setValue("password", list.at(i).password);
 }
 settings.endArray();

得到的键如下

  • logins/size
  • logins/1/userName
  • logins/1/password
  • logins/2/userName
  • logins/2/password
  • logins/3/userName
  • logins/3/password

其中size是自动侦测到的长度,要想把他们读取出来,可以使用如下的方法

struct Login {
     QString userName;
     QString password;
 };
 QList<Login> logins;
 ...

 QSettings settings;
 int size = settings.beginReadArray("logins");
 for (int i = 0; i < size; ++i) {
     settings.setArrayIndex(i);
     Login login;
     login.userName = settings.value("userName").toString();
     login.password = settings.value("password").toString();
     logins.append(login);
 }
 settings.endArray();

例子,  保存GUI应用程序的状态,在关闭应用程序时候保存应用程序窗口的大小和位置,在再次打开应用程序时候,读取出来

void MainWindow::writeSettings()
 {
     QSettings settings("Moose Soft", "Clipper");

     settings.beginGroup("MainWindow");
     settings.setValue("size", size());
     settings.setValue("pos", pos());
     settings.endGroup();
 }

 void MainWindow::readSettings()
 {
     QSettings settings("Moose Soft", "Clipper");

     settings.beginGroup("MainWindow");
     resize(settings.value("size", QSize(400, 400)).toSize());
     move(settings.value("pos", QPoint(200, 200)).toPoint());
     settings.endGroup();
 }

使用QWidget::resize()和QWidget::move()比QWidget::setGeometry()要更好,在构造函数中调用readSetting(),在关闭窗口事件中调用writeSettings()。

MainWindow::MainWindow()
 {
     ...
     readSettings();
 }

 void MainWindow::closeEvent(QCloseEvent *event)
 {
     if (userReallyWantsToQuit()) {
         writeSettings();
         event->accept();
     } else {
         event->ignore();
     }
 }