Qt编程中的一些小问题2

2010.05.15
QStandardItemModel model;

//设置大小

model.setColumnCount(3);    //列
model.setRowCount(musicFound);    //行

//设置标题

model.setHeaderData(0,Qt::Horizontal,"ID");

//添加数据

for(int j=0;j<row;j++)
{
            //写id
            QStandardItem *itemID = new QStandardItem("hello");//QString::number(j)));
            model.setItem(j,0,itemID);

}

//选择这个model

m_ui->tableView->setModel(&model);

//隐藏左边那列
m_ui->tableView->verticalHeader()->hide();
//列宽
m_ui->tableView->setColumnWidth(0,30);
//整行选择
m_ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);

但视图与模型绑定时,模型必须使用new来创建。否则视图不能随着模型的改变而改变。

Eorror错误的写法
QStandardItemModel model(4,2);


model.setHeaderData(0, Qt::Horizontal, tr("Label"));
model.setHeaderData(1, Qt::Horizontal, tr("Quantity"));


ui.tableView->setModel(&model);

for (int row = 0; row < 4; ++row) {
    for (int column = 0; column < 2; ++column) {
        QModelIndex index = model.index(row, column, QModelIndex());
        model.setData(index, QVariant((row+1) * (column+1)));
    }
}

Right 正确的写法
QStandardItemModel *model;

model = new QStandardItemModel(4,2);
ui.tableView->setModel(model);

model->setHeaderData(0, Qt::Horizontal, tr("Label"));
model->setHeaderData(1, Qt::Horizontal, tr("Quantity"));

for (int row = 0; row < 4; ++row) {
    for (int column = 0; column < 2; ++column) {
        QModelIndex index = model->index(row, column, QModelIndex());
        model->setData(index, QVariant((row+1) * (column+1)));
    }
}
 取得QTableView的特定行,特定列的数据

 

取得QTableView的特定行,特定列的数据。

QModelIndex index = ui.tableView->currentIndex();
if (!index.isValid())
{
QMessageBox::information (NULL,"提示","请先选择一行数据。");
return;
}

int iRow;
iRow = index.row();
QAbstractItemModel* model = ui.tableView->model();
//取得层数据库的数据表名
index = model->index(iRow,1,QModelIndex());

QString strHorizonName;
strHorizonName = index.data().toString();

QString
1.使用QString对象来表示所有用户可见的文本。由于QString内部使用Unicode编码来实现,它可以用来表示所有需要向用户呈现的文本。当然对于仅仅程序员可见的文本并不需要都变成QString对象,可利用Qt提供的QCString或者原始的char *。

2.使用tr()函数来取得所有需要翻译的文本。在Qt的翻译机制下,QObject::tr()函数可以帮我们取得翻译之后的文本。对于从QObject继承而来的类,QObject::tr()函数最终由QMetaObject::tr()来实现,Q_OBJECT宏的定义以及在qmetaobject.cpp中QMetaObject::tr()的实现。在某些时候如果无法使用QObject::tr()函数,我们还可以直接调用QCoreApplication::translate()来取得翻译之后的字符串。

3.使用QString::arg()来组织动态文本。有些时候一段文本需要由一些静态文本和动态变量组合起来,比如常见的情况:printf(“The value of i is: %d”, i)。对于这种动态文本的翻译,由于语言习惯的问题,如果简单的采用这种连接字符串的方法,可能会带来一些问题。比如下面的字符串用来表示任务的完成情况:
QString m = tr(“Mission status: “ )+ x + tr(“of “) + y +tr(”are completed”);

其中x和y是动态的变量,三个字符串被x和y分隔开,它们无法被很好的翻译——”x of y”是英语中分数的表示方法,比如4 of 5是分数4/5,在不同的语言中分子和分母的位置可能是颠倒的,这种情况下数字4和5的位置在翻译的时候无法被正确的放置,可见孤立地翻译被分隔开的字符串是不行的,改进的办法是使用

QString::arg()方法:
        QString m = tr(“Mission status: %1 of %2 are completed”).arg(x).arg(y);

这样翻译工作者可以将整个字符串进行翻译,并将参数%1和%2放到正确的位置。

4.利用QTranslator::load()和QCoreApplication::installTranslator()来读取对应的翻译之后的资源文件。翻译工作者将提供包含有翻译之后的字符串的资源文件*.qm,程序员还需要做的是定义QTranslator对象,并用load()函数读取相应的.qm文件,然后利用QCoreApplication::installTranslator()函数来安装QTranslator对象。

对于翻译工作者,主要是利用Qt提供的工具lupdate、linguist和lrelease(它们都可以在Qt安装目录的bin文件夹下找到)来协助翻译工作并生成最后需要的.qm文件,包括以下内容:

1.利用lupdate工具从源代码中扫描并提取需要翻译的字符串,生成.ts文件。类似编译时用到的qmake,运行lupdate时我们也需要指定一个.pro的文件,这个.pro文件可以单独创建,也可以利用编译时用到的.pro文件,只需要定义好变量TRANSLATIONS就可以了,具体用法可以参见后面的小例子。

2.利用linguist工具来协助完成翻译工作,即打开前面用lupdate生成的.ts文件,对其中的字符串逐条进行翻译并保存。由于.ts文件采用了xml格式,我们也可以用其它编辑器来打开.ts文件并翻译。

3.利用lrelease工具处理翻译好的.ts文件,生成格式更为紧凑的.qm文件。这便是翻译工作者最终需要提供给程序员的资源文件,它所占的空间比.ts文件小,但基本不具有可读性,只有QTranslator能正确的识别它。
2010.05.16
QString字符串类
QString类提供一个unicode文本和经典的C中以零结果的字符数组的抽象
QString::QString()
构造一个零字符串
QString::QString(QChar ch)
构造一个长度为一个字符,内容为给定字符ch的字符串
QString::QString(const QString &s)
构造一个给定字符序列的字符串
QString & QString::append(const QString &str)
QString & QString::append ( char ch )
QString & QString::append ( QChar ch )
追加str字符串并返回结果的引用
QChar QString::at(uint i)const
返回索引i处的字符,数组从0开始
int QString::compare(const QString &s1,const QString &s2)静态
比较两个字符串,返回大于0小于0等于0的整数
int QString::contains(QChar c,bool cs=TRUE)const
返回在这个字符串中字符c出现的次数,如果cs为真则区分大小写
bool QString::endsWith(const QString &s)const
如果字符串以s结尾返回真
QString & QString::fill(QChar c,int len=-1)
填充字符串为len个字符的值c并返回引用
int QString::find(const QRegExp &rx,int index=0)const
从位置index处开始搜索正则表达式rx并返回位置
bool QString::isEmpty() const
如果字符串为空返回真
bool QString::isNull()const
如果字符串为零返回真
QString QString::left(uint len)const
返回包含字符串最左边len个字符的子串
uint QString::length() const
返回字符串的长度,零字符串和空串返回0
int QString::localAwareCompare(const QString &s1,const QString &s2)静态
基于本地的并且基于平台的字符串比较函数
QString QString::lower()const
返回该字符串的小写串
QString QString::mid(uint index,uint len)const
返回从index处开始的len个长度的子串
QString QString::number(long n,int base=10)静态
把数字n转换为基数为base的字符串
QString QString::right(uint len)const
返回最右边的len个长度的子串
QString & QString::sprintf(const char *cformat,...)
从一个格式化字符串cformat和一个任意参数列表安全地构建一个格式化的字符串
bool QString::startsWith(const QString &s)const
如果字符串以s开头,返回真
double QString::toDouble(bool *ok=0)const
将字符串转换为双精度数字型
如果发生错误,*ok被设置为假,否则为真
float QString::toFloat(bool *ok=0)const
将字符串转换为单精度数值型
如果发生错误,*ok被设置为假,否则为真
int QString::toInt(bool *ok=0,int base=10)const
将字符串转换为整型,基于base进制
long QString::toLong ( bool * ok = 0, int base = 10 ) const
short QString::toShort ( bool * ok = 0, int base = 10 ) const
uint QString::toUInt ( bool * ok = 0, int base = 10 ) const
ulong QString::toULong ( bool * ok = 0, int base = 10 ) const
ushort QString::toUShort ( bool * ok = 0, int base = 10 ) const
QString QString::upper() const
返回这个字符串的大写字符串
QCString QString::utf8() const
返回按UTF8格式编码的字符串

mysql 驱动问题:
首次运行出现 dirver not found diver not found
随后将 /opt/qtsdk-2010.02/qt/src/sql/drivers/mysql中的文件复制到工程目录,添加到工程中,但出现找不到<mysql>的头文件,又将其删除了。
通过 locate mysql指令之后查到 /usr/lib/qt4/plugins/sqldrivers中有libqsqlmysql.so这个库文件,但是在/opt/qtsdk-2010.02/qt/plugins/sqldrivers中没有 mysql的这个动态链接库文件,将其复制到该目录,随后运行工程,即成功了。
网上的方法,是找不到libqsqlmysql.so这个库文件,然后下载qt-opensource编译libqsqlmysql.so这个驱动,如果机器上有,就不用编译了,网上的方法如下:
Qt SDK包含了QtCreator和Qt基础库,是个非常优秀的开发环境。但这个安装包里面的Qt基础库的plugins里面数据库驱动只有sqlite,没包含 mysql 的驱动,而mysql是很常用的一个数据库平台。
如果你需要mysql的驱动,可以按下面的办法做:

到Trolltech下个Qt的源码包,这个包里面有mysql驱动的源程序。在编译mysql驱动之前,请确定你已经安装了完整的mySQL数据库,一定要包括mysql-devel,这是编译驱动需要的。
下面以我的机器环境为例进行操作。
tar -zxvf qt-x11-opensource-src-4.5.1.tar.gz
cd qt-x11-opensource-src-4.5.1/src/plugins/sqldrivers/mysql
qmake-qt4 "INCLUDEPATH+=/usr/include/mysql" "LIBS+=-L/usr/lib/mysql -lmysqlclient_r" mysql.pro
make

执行完成之后,操作所在的路径中会多出一个文件 libqsqlmysql.so,这就是qt的mysql驱动。把它拷贝到Qt SDK的Qt相应位置上,在我的机器里它在/home/pub/qtsdk-2009.02/qt/plugins/sqldrivers里。

方法一:
QString qstr("hello,word");
const char * p = qstr.toLocal8Bit().data();
方法二:
const char *p = qstr.toStdString().data();

你可能感兴趣的:(编程,mysql,数据库,工作,正则表达式,qt)