zhonghua

C++博客 首页 新随笔 联系 聚合 管理
  72 Posts :: 1 Stories :: 4 Comments :: 0 Trackbacks

#

Qt  QSqlTableModel  使用心得

连接数据库

执行sql查询,条件显示,排序

获取记录数,列数以及记录内容,字段内容

新增,修改,删除,恢复

其它

 

 

1---------------连接数据库(我用的access2003做实验)

在.pro文件添加

QT  +=SQL

win32:CONFIG+=console

 

------------------------MAIN.CPP---------------

#include <QtGui/QApplication>

#include <QSqlDatabase>

#include <QSqlQuery>

#include <QDebug>

#include <QVariant>

#include <QString>

#include <QSqlTableModel>

#include <QTableView>

#include "mainwindow.h"

int main(intargc, char *argv[])

{

    QApplication a(argc, argv);

   // MainWindow w;

    //w.show();

    QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");

    db.setDatabaseName("DRIVER={Microsoft AccessDriver (*.mdb)};FIL={MS Access};DBQ=barcode.mdb;UID='';PWD=''");

    bool ok = db.open();

    if(ok)

    {

        qDebug()<<"connect ok!";

    }

    else

    {

        qDebug()<<"connect error!";

        return false;

    }

    return a.exec();

}

2-----执行sql查询,条件显示,排序

查询:

model = newQSqlTableModel(this);
model->setTable(“student”);
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->select(); //选取整个表的所有行
// model->removeColumn(1); //不显示第二列,如果这时添加记录,则该属性的值添加不上

QTableView *view= new QTableView;

        view->setModel(model);

        view->show();

//View->setEditTriggers(QAbstractItemView::NoEditTriggers);  使其不可编辑

条件:(等价于SQL语句的where)

model->setFilter(QObject::tr(“name= ‘admin’”).arg(name)); //根据姓名进行筛选
    model->select(); //显示结果

排序:(等价于ORDERBY)
   model->setSort(0,Qt::AscendingOrder); //id属性,即第0列,升序排列
   model->select();


    model->setSort(0,Qt::DescendingOrder); //id属性,即第0列,降序排
    model->select();

3------获取记录数,列数以及记录内容,字段内容

记录数: Model->rowcount

记录值:

值=model.record(num).value(1).toString(); 

Qrecord record= QSqlRecord record = tablemodel.record(记录行数); 

值=Record.value(“字段名或索引”)

字段数:

字段值:

 

4------新增,修改,删除,提交,撤销

新增:

    int rowNum = model->rowCount();//获得表的行数
   int id = 10;
    model->insertRow(rowNum); //添加一行
    model->setData(model->index(rowNum,0),id);
    //model->submitAll(); //可以直接提交

或者用record添加

QSqlRecord record = tablemodel.record();

record.setValue("nam","new");

model.insertRecord(1,record);

 

修改:

首先用条件找到某一条记录

QSqlRecord record = tablemodel.record(num);

record.setValue("name",record.value("name").toString()+"2");

tablemodel.setRecord(num,record);

if(tablemodel.submitAll())

"成功!"

else

"失败!"

或者用下面方法用setData()来修改,代码如下: 
model.setData(model.index(1,1),"new");
 
if(tablemodel.submitAll()) 
   "成功!"
else 
   "失败!"


删除:
    int curRow = ui->tableView->currentIndex().row();
    //获取选中的行
    model->removeRow(curRow);
    //删除该行
    int ok = QMessageBox::warning(this,tr(“删除当前行!”),tr(“你确定”
                                                          “删除当前行吗?”),
                        QMessageBox::Yes,QMessageBox::No);
    if(ok == QMessageBox::No)
    {
       model->revertAll();//如果不删除,则撤销
    }
    else model->submitAll(); //否则提交,在数据库中删除该行

如果没有table

tablemodel.removeRows(起始行, 要删除的总行数); 
model.submitAll(); 


提交  

    model->database().transaction();//开始事务操作
    if (model->submitAll()) {
        model->database().commit();//提交
    } else {
        model->database().rollback();//回滚
        QMessageBox::warning(this,tr(“tableModel”),
                            tr(“数据库错误: %1″)
                            .arg(model->lastError().text()));
    }

撤销  

  model->revertAll();

5------其它

 



he QSqlTableModel class provides an editable data model for a single database table. More...

  1. <span class="preprocessor" style="color:#404040">#include <QSqlTableModel></span>  

Inherits: QSqlQueryModel.

Inherited by: QSqlRelationalTableModel.

Public Types

enum EditStrategy { OnFieldChange, OnRowChange, OnManualSubmit }

Public Functions

  QSqlTableModel ( QObject * parent = 0, QSqlDatabase db = QSqlDatabase() )
virtual ~QSqlTableModel ()
QSqlDatabase database () const
EditStrategy editStrategy () const
int fieldIndex ( const QString & fieldName ) const
QString filter () const
bool insertRecord ( int row, const QSqlRecord & record )
bool isDirty ( const QModelIndex & index ) const
QSqlIndex primaryKey () const
virtual void revertRow ( int row )
virtual bool select ()
virtual void setEditStrategy ( EditStrategy strategy )
virtual void setFilter ( const QString & filter )
bool setRecord ( int row, const QSqlRecord & record )
virtual void setSort ( int column, Qt::SortOrder order )
virtual void setTable ( const QString & tableName )
QString tableName () const

Reimplemented Public Functions

virtual void clear ()
virtual QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) const
virtual Qt::ItemFlags flags ( const QModelIndex & index ) const
virtual QVariant headerData ( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const
virtual bool insertRows ( int row, int count, const QModelIndex & parent = QModelIndex() )
virtual bool removeColumns ( int column, int count, const QModelIndex & parent = QModelIndex() )
virtual bool removeRows ( int row, int count, const QModelIndex & parent = QModelIndex() )
virtual int rowCount ( const QModelIndex & parent = QModelIndex() ) const
virtual bool setData ( const QModelIndex & index, const QVariant & value, int role = Qt::EditRole )
virtual void sort ( int column, Qt::SortOrder order )

Public Slots

virtual void revert ()
void revertAll ()
virtual bool submit ()
bool submitAll ()

Signals

void beforeDelete ( int row )
void beforeInsert ( QSqlRecord & record )
void beforeUpdate ( int row, QSqlRecord & record )
void primeInsert ( int row, QSqlRecord & record )

Protected Functions

virtual bool deleteRowFromTable ( int row )
QModelIndex indexInQuery ( const QModelIndex & item ) const
virtual bool insertRowIntoTable ( const QSqlRecord & values )
virtual QString orderByClause () const
virtual QString selectStatement () const
void setPrimaryKey ( const QSqlIndex & key )
void setQuery ( const QSqlQuery & query )
virtual bool updateRowInTable ( int row, const QSqlRecord & values )
posted @ 2012-08-20 11:24 米米 阅读(5083) | 评论 (0)编辑 收藏

可能大家或多或少都在qmake的.pro/.pri文件中见过这种代码

TEMPLATE += fakelib
MY_NAME = $$qtLibraryTarget(dbzhang800)
TEMPLATE -= fakelib

如果真的没见过,或许可以从这儿入手分析与学习Qt Solution对qmake的使用
$$qtLibraryTarget 有什么用

我们知道,在Window下,动态库的 Debug 和 Release 版不能通用,所以要放置在不同的路径下或者取不同的名字。在Qt下,我们经常见到

    QtCore4.dll

    QtCored4.dll

而当我们自己的工程中需要动态库时,要想在兼顾各个平台下,给它取个合适的名字还是有点小小的挑战的。

既然Qt已经能处理自己的动态库,我们不妨直接借用它提供的机制,这便是

$$qtLibraryTarget

    作用:为各个平台下的库生成合适的名字
    位置:$QTDIR/mkspecs/features/qt_functions.prf
    具体代码:

defineReplace(qtLibraryTarget) {
   unset(LIBRARY_NAME)
   LIBRARY_NAME = $$1
   mac:!static:contains(QT_CONFIG, qt_framework) {
      QMAKE_FRAMEWORK_BUNDLE_NAME = $$LIBRARY_NAME
      export(QMAKE_FRAMEWORK_BUNDLE_NAME)
   }
   contains(TEMPLATE, .*lib):CONFIG(debug, debug|release) {
      !debug_and_release|build_pass {
          mac:RET = $$member(LIBRARY_NAME, 0)_debug
              else:win32:RET = $$member(LIBRARY_NAME, 0)d
      }
   }
   isEmpty(RET):RET = $$LIBRARY_NAME
   return($$RET)
}

注:这是Qt4.8下的文件,Qt5.0下与此小有不同。

从这儿你可以看到,在windows下它何时会添加一个d,何时不会。
fakelib 干嘛用的

从前面的代码中,我们看到有这么一句

   contains(TEMPLATE, .*lib)

可是,当构建动态库时,不是TEMPLATE确实就是 lib/vclib这些了么?

恩,构建时没有问题,可是当使用时呢?比如

TEMPLATE = app
SOURCES += main.cpp

LIBS += $$qtLibraryTarget(dbzhang800)

还能工作么?

恩,所以了。就需要随便取一个 xxxxxlib 作为模板来哄骗一下它。
还没结束?

自从认识它以后,一直在自己的程序中大量使用这个东西。但是有一件事情总是让人感觉不爽。

使用它以后:

qmake -tp vc

生成的MSVC的工程文件中,总是不能得到正确库文件的名字(具体一点,就是Debug模式下没有那个d)

自己用也没什么,反正也不是什么大问题。只是没想到解决方案竟是这样

SAVE_TEMPLATE = $$TEMPLATE
TEMPLATE = fakelib
MY_NAME = $$qtLibraryTarget(dbzhang800)
TEMPLATE = $$SAVE_TEMPLATE

原因

当qmake使用了 -tp 选项后,对TEMPLATE处理时,只接受一个值。也就是 += 操作对其无效。

具体一点,位于qmake源码 project.cpp 的3043行

    } else if(var == QLatin1String("TEMPLATE")) {
        if(!Option::user_template.isEmpty()) {
            var = ".BUILTIN.USER." + var;
            place[var] =  QStringList(Option::user_template);
        } else {
            QString orig_template, real_template;
            if(!place[var].isEmpty())
                orig_template = place[var].first();
            real_template = orig_template.isEmpty() ? "app" : orig_template;
            if(!Option::user_template_prefix.isEmpty() && !orig_template.startsWith(Option::user_template_prefix))
                real_template.prepend(Option::user_template_prefix);
            if(real_template != orig_template) {
                var = ".BUILTIN." + var;
                place[var] = QStringList(real_template);
            }
        }
posted @ 2012-08-17 14:01 米米 阅读(391) | 评论 (0)编辑 收藏

QtPropertyBrowser2.5中的字符串属性对应的修改方式是一个输入框,OnValueChange是在每次键入字符时发送一次.这个对于编辑器需要的逻辑来说是一种灾难. Ogitor修改了其源码,解决了这个问题:

 

qteditorfactory.h 中

QtLineEditFactory类添加如下代码,红色标识

class QT_QTPROPERTYBROWSER_EXPORT QtLineEditFactory : public QtAbstractEditorFactory<QtStringPropertyManager>
{
    Q_OBJECT
public:
    QtLineEditFactory(QObject *parent = 0);
    ~QtLineEditFactory();
protected:
    void connectPropertyManager(QtStringPropertyManager *manager);
    QWidget *createEditor(QtStringPropertyManager *manager, QtProperty *property,
                QWidget *parent);
    void disconnectPropertyManager(QtStringPropertyManager *manager);
private:
    QtLineEditFactoryPrivate *d_ptr;
    Q_DECLARE_PRIVATE(QtLineEditFactory)
    Q_DISABLE_COPY(QtLineEditFactory)
    Q_PRIVATE_SLOT(d_func(), void slotPropertyChanged(QtProperty *, const QString &))
    Q_PRIVATE_SLOT(d_func(), void slotRegExpChanged(QtProperty *, const QRegExp &))
    Q_PRIVATE_SLOT(d_func(), void slotSetValue(const QString &))
    Q_PRIVATE_SLOT(d_func(), void slotEditingFinished())
    Q_PRIVATE_SLOT(d_func(), void slotEditorDestroyed(QObject *))
};

 

qteditorfactory.cpp中

class QtLineEditFactoryPrivate : public EditorFactoryPrivate<QLineEdit>
{
    QtLineEditFactory *q_ptr;
    Q_DECLARE_PUBLIC(QtLineEditFactory)
public:

    void slotPropertyChanged(QtProperty *property, const QString &value);
    void slotRegExpChanged(QtProperty *property, const QRegExp &regExp);
    void slotSetValue(const QString &value);
    void slotEditingFinished();
};

void QtLineEditFactoryPrivate::slotEditingFinished()
{
    QObject *object = q_ptr->sender();
    const QMap<QLineEdit *, QtProperty *>::ConstIterator ecend = m_editorToProperty.constEnd();
    for (QMap<QLineEdit *, QtProperty *>::ConstIterator itEditor = m_editorToProperty.constBegin(); itEditor != ecend; ++itEditor)
        if (itEditor.key() == object) {
            QtProperty *property = itEditor.value();
            QtStringPropertyManager *manager = q_ptr->propertyManager(property);
            if (!manager)
                return;
            QString value = static_cast<QLineEdit*>(itEditor.key())->text();
            manager->setValue(property, value);
            return;
        }
}

QWidget *QtLineEditFactory::createEditor(QtStringPropertyManager *manager,
        QtProperty *property, QWidget *parent)
{

    QLineEdit *editor = d_ptr->createEditor(property, parent);
    QRegExp regExp = manager->regExp(property);
    if (regExp.isValid()) {
        QValidator *validator = new QRegExpValidator(regExp, editor);
        editor->setValidator(validator);
    }
    editor->setText(manager->value(property));

    connect(editor, SIGNAL(editingFinished()),
                this, SLOT(slotEditingFinished()));
    connect(editor, SIGNAL(destroyed(QObject *)),
                this, SLOT(slotEditorDestroyed(QObject *)));
    return editor;
}

 

这样既可在输入回车键,或者输入框失去焦点后产生一个OnValueChange事件

posted @ 2012-08-17 13:52 米米 阅读(641) | 评论 (0)编辑 收藏

lrelease  zhu_zh.ts 1_zh.ts -qm aaa.qm
posted @ 2012-08-02 16:37 米米 阅读(230) | 评论 (0)编辑 收藏

使用setStyleSheet来设置图形界面的外观:
QT Style Sheets是一个很有利的工具,允许定制窗口的外观,
此外还可以用子类QStyle来完成,他的语法很大比重来源于html的CSS,但是适用于窗口
概括:
Style Sheets是文字性的设定,对于整个应用程序可以使用QApplication::setStyleSheet() 或者对应一个窗口可以使用QWidget::setStyleSheet(),如果好几个样式表在不同的层次上设定,
QT将会集合所有的样式表来设定外观,这称作级串联
例如:下面的样式表指定所有的QLineEdit应该用黄色作为他们的背景颜色,所有的核对框应该用红色作为他们的文本颜色
  1. QLineEdit { background: yellow }
  2. QCheckBox { color: red }
复制代码
对于这种定制,样式表比palette调色板更强大,例如使用QPalette::Button role来设定一个按钮为红色可能引起危险
对于单独使用QPalette很难完成的定制,样式表可以指定样式表作用于当前窗口样式顶部,这意味这应用程序讲看起来尽可能的自然,但是任何样式表系统 参数应该考虑,不像QPalette那样,样式表提供检查,如果你设定了一个按钮的背景颜色为红色,你应该确定在所有的平台按钮将会有一个红色的背景,除 此,Qt Designer提供样式表集成环境,使得在不同的窗口样式中更容易看到样式表的效果
此外,样式表可以用来为你的应用程序提供一个出众的外观,不需要使用子类QStyle,例如,可以指定任意的图片为单选按钮和核对按钮,来使它们出众,使 用这个技术,也可以获得辅助的定制,这将使用几个子类,例如指定style hint(样式暗示),可以参看例子 Style Sheet。
当样式表有效时候,使用QWidget::style()可以返回QStyle,
样式表语法:
样式表语法基本和HTML CSS语法一致。
样式表包含了样式规则序列,样式规则有一个<selector>和<declaration>组成,<selector>指定哪些窗口将会被这些规则影响,<declaration>指定哪些属性将会被设定在窗口上,例如
QPushButton{color:red}
在上面的,规则中,QPushButton是<selector>,{color:red}是<declaration>,这个规则指定QPushButton和他的子类将使用红色作为前景颜色,就是字体颜色,并且对大小写没有分别,对于
color,ColoR,COLOR是一样的。
几个<selector>可以同时被列出,使用逗号","来分开各个<selector>,例如:
QPushButton, QLineEdit, QComboBox { color: red }
<declaration>部分是一对 属性:值  对,用{}来括起来,使用分号来分开各个属性,例如
QPushButton { color: red; background-color: white }
可以参看Qt Style Sheets Reference来查看部件以及样式表的属性列表
关于样式表的级联属性
看下面代码的不同
  1. btn1->setStyleSheet("QPushButton{color:red}"); //设定前景颜色,就是字体颜色
  2. btn1->setStyleSheet("QPushButton{background:yellow}"); //设定背景颜色为红色
复制代码

  1. btn1->setStyleSheet("QPushButton{color:red;background:yellow}");
复制代码
第一个代码只能显示黄色背景,第二个确实红色字体,黄色背景,
所以当设定一个部件时候,要在同一个>setStyleSheet()中完全写出来。
源代码示例:
  1. Dialog::Dialog(QWidget *parent) :
  2.     QDialog(parent),
  3.     ui(new Ui::Dialog)
  4. {
  5.     ui->setupUi(this);
  6.     this->setWindowFlags(this->windowFlags()&Qt::WindowMaximizeButtonHint&Qt::WindowMinimizeButtonHint); //为对话框添加上最大化和最小化按钮
  7. //    layout=new QBoxLayout(this);
  8.     layout1=new QGridLayout(this);
  9.     btn1=new QPushButton(this);
  10.     btn1->setStyleSheet("QPushButton{color:red;background:yellow}"); //设定前景颜色,就是字体颜色
  11. //    btn1->setStyleSheet("QPushButton{background:yellow}");
  12.     btn1->setText("Button1");
  13.     btn2=new QPushButton(this);
  14.     btn2->setStyleSheet("QPushButton{color:red;background-color:#c89b64}"); //使用rgb来设定背景颜色
  15.     btn2->setText("Button2");
  16.      btn3=new QPushButton(this);
  17.      btn3->setStyleSheet("QPushButton{background-image:url(image/1.png);background-repeat: repeat-xy;background-position: center;background-attachment: fixed;background-attachment: fixed;background-attachment: fixed;;background-clip: padding}");
  18.      //设定按钮的背景图片,background-repeat可以设定背景图片的重复规则,这里设定仅在xy方向都重复,所以图片会被重复一次
  19.      //background-position用来设定图片的位置,是左(left)还是右(right),还是在中间(center),是上(top)还是底部(bottom)
  20.      //background-attachment用来这定背景图片是否卷动或者和窗口大小相匹配,默认是卷动的
  21.      btn3->setText("Button3");
  22.      btn4=new QPushButton(this);
  23.      btn4->setStyleSheet("QPushButton{border: 3px solid red;border-radius:8px}"); //设定边框宽度以及颜色
  24.      //可以使用border-top,border-right,border-bottom,border-left分别设定按钮的上下左右边框,
  25.      //同样有border-left-color, border-left-style, border-left-width.等分别来设定他们的颜色,样式和宽度
  26.      //border-image用来设定边框的背景图片。
  27.      //border-radius用来设定边框的弧度。可以设定圆角的按钮
  28.      btn4->setText("Button4");
  29.      //字体设定
  30.      //font-family来设定字体所属家族,
  31.      //font-size来设定字体大小
  32.      //font-style来设定字体样式
  33.      //font-weight来设定字体深浅
  34.      //height用来设定其高低
  35.      //selection-color用来设定选中时候的颜色
  36.      edit1=new QLineEdit(this);
  37.      edit1->setStyleSheet("QLineEdit{font: bold italic large \"Times New Roman\";font-size:25px;color:#3764ff;height:50px;border:4px solid #9bc821;border-radius:15px;selection-color:pink}");
  38.      //父窗口的设定
  39.      //icon-size来设定图片大小
  40.      this->setWindowIcon(QIcon("image/1.png"));
  41.       this->setStyleSheet("QWidget{background:write url(image/2.png);icon-size:20px 5px}");  //设定整个对话框的背景颜色
  42. //      this->setStyleSheet("QWidget{icon-size:20px 5px}");
  43.     layout1->addWidget(btn1,0,0);
  44.     layout1->addWidget(btn2,0,1);
  45.     layout1->addWidget(btn3,1,0);
  46.     layout1->addWidget(btn4,1,1);
  47.      layout1->addWidget(edit1,2,0);
  48. }
posted @ 2012-07-20 14:14 米米 阅读(989) | 评论 (0)编辑 收藏

//如果设置 show-decoration-selected:1会导致点击选中后,前面branch区域背景为高亮的橙色.

    ui->treeView->setVerticalScrollBarPolicy ( Qt::ScrollBarAlwaysOff ) ;

              ui->treeView->setStyleSheet(   \
                      " QTreeView { \
                                    show-decoration-selected: 0; \
                                } \
                                \
                                QTreeView::item { \
                                    show-decoration-selected: 0; \
                                    background-image:url(image/list_bg02.png); \
                                } \
                                QTreeView::item:selected{ \
                                    background-image:url(image/list_bg01a.png); \
                                }  \
             QTreeView::branch { \
                      selection-color: transparent; \
              } \
              QTreeView::branch:closed:has-children:has-siblings { \
                      image: url(image/icon_add.png); \
              } \
               \
              QTreeView::branch:has-children:!has-siblings:closed { \
                      image: url(image/icon_add.png); \
              } \
               \
              QTreeView::branch:open:has-children:has-siblings { \
                      image: url(image/icon_reduce.png); \
              } \
\
              QTreeView::branch:open:has-children:!has-siblings { \
                      image: url(image/icon_reduce.png); \
              }");

 


    ui->treeView->setAttribute(Qt::WA_MacShowFocusRect, 0);
    ui->treeView->setFocusPolicy(Qt::NoFocus);
    ui->treeView->setEditTriggers(QAbstractItemView::NoEditTriggers);
posted @ 2012-07-20 12:13 米米 阅读(2003) | 评论 (0)编辑 收藏

  默认的情况下,QTableView,QTableWidget等控件,当item选中后其背景色为蓝色的,文字颜色(前景色)为白色的,如图:

        默认的item选中后的背景色(白色)

 

    如果我们想动态的更改item的前景色(例如值大于零显示红色,小于零显示绿色),并且选中后文字颜色不变(这个是我想实现的,其实就是模仿一般的股票价格图表),怎么办呢? 首先在添加或者修改item的时候,可以使用:

 model->item(row, column)->setForeground(QBrush(QColor(255, 0, 0)));  //把表格的item的文字颜色设置为红色

但是只这样还是不够的,这样只能保证在不选中的情况下显示为红色, 若不做其他设置,选中后item的颜色照样变成白色的了。

 

    对此我找到了使用代理的方法,使选中后的文字颜色和选中前的文字颜色一致(也可以灵活修改),效果如下图,代码随后。

 

       //黄色的那行为选中行

 

 

   

  1. //委托(代理)   
  2. class ItemDelegate : public QItemDelegate  
  3. {  
  4.     Q_OBJECT  
  5. public:  
  6.     ItemDelegate()  
  7.     {  
  8.     }  
  9.     void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const  
  10.     {  
  11.         QStyleOptionViewItem  viewOption(option);  
  12.         //高亮显示与普通显示时的前景色一致(即选中行和为选中时候的文字颜色一样)   
  13.         viewOption.palette.setColor(QPalette::HighlightedText, index.data(Qt::ForegroundRole).value<QColor>());  
  14.         QItemDelegate::paint(painter, viewOption, index);  
  15.     }  
  16. };  
  1. //委托(代理)  
  2. class ItemDelegate : public QItemDelegate  
  3. {  
  4.     Q_OBJECT  
  5. public:  
  6.     ItemDelegate()  
  7.     {  
  8.     }  
  9.     void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const  
  10.     {  
  11.         QStyleOptionViewItem  viewOption(option);  
  12.         //高亮显示与普通显示时的前景色一致(即选中行和为选中时候的文字颜色一样)  
  13.         viewOption.palette.setColor(QPalette::HighlightedText, index.data(Qt::ForegroundRole).value<QColor>());  
  14.         QItemDelegate::paint(painter, viewOption, index);  
  15.     }  
  16. };  

 

   

  1. view = new QTableView;  
  2. model = new QStandardItemModel;  
  3. view->setModel(model);  
  4. view->setItemDelegate(new ItemDelegate);  
  1. view = new QTableView;  
  2. model = new QStandardItemModel;  
  3. view->setModel(model);  
  4. view->setItemDelegate(new ItemDelegate);  

 

  

  1. if (strList[2].toDouble() >= strList[3].toDouble())  
  2.     model->item(row, 2)->setForeground(QBrush(QColor(255, 0, 0)));  
  3. else  
  4.     model->item(row, 2)->setForeground(QBrush(QColor(0, 127, 0)));  
  5. if (strList[4].toDouble() >= strList[3].toDouble())  
  6.     model->item(row, 4)->setForeground(QBrush(QColor(255, 0, 0)));  
  7. else  
  8.     model->item(row, 4)->setForeground(QBrush(QColor(0, 127, 0)));  
  1. if (strList[2].toDouble() >= strList[3].toDouble())  
  2.     model->item(row, 2)->setForeground(QBrush(QColor(255, 0, 0)));  
  3. else  
  4.     model->item(row, 2)->setForeground(QBrush(QColor(0, 127, 0)));  
  5. if (strList[4].toDouble() >= strList[3].toDouble())  
  6.     model->item(row, 4)->setForeground(QBrush(QColor(255, 0, 0)));  
  7. else  
  8.     model->item(row, 4)->setForeground(QBrush(QColor(0, 127, 0))); 
posted @ 2012-07-20 12:12 米米 阅读(949) | 评论 (0)编辑 收藏

   // 样式

    ui->treeView->setStyleSheet(

            "QTreeView::item{height: 60px;show-decoration-selected: 0;background-image:url(image/list_content_bg.png);}"

            "QTreeView::item:selected{background-image:url(image/list_select_bg.png);}"

            );

 

//设置图标

QVariant data(const QModelIndex &index, int role)
{

if (!index.isValid())
    return QVariant();

if(role == Qt::UserRole)
{

}
 if(role ==Qt::BackgroundRole)
{
    QImage  image("image/list_bg02.png");
    return QBrush(image);
}

if(index.column()==0)
{

 

    if(role == Qt::DecorationRole)
    {
        QImage image;
        image.load("image/icon_user.png");
        return image;//QIcon("image/icon_user.png");
    }

}

图标大小  :属性 iconSize

ui->treeView->setIconSize(QSize(32,32));
posted @ 2012-07-20 11:23 米米 阅读(1100) | 评论 (0)编辑 收藏

QApplication::setStyleSheet(QString);
QWidget::setStyleSheet(QString);

1. 程序级的外观:(作用于整个程序的器件)
如:

QLineEdit { background: yellow }
QCheckBox { color: red }

2. 器件级的外观:(作用于本器件及其子器件)
如:

textViewer->
setStyleSheet("background-color: #FFFFBB;"
                "color: #000099;"
                "margin: 10px;"
                "padding: 5px;"
                "padding-left: 15px;"
                "padding-right: 15px;"
                "border-radius: 5px;" // 圆角边框(只用IE的人就不知道了吧:D)
                "border: 3px solid #abc;");
 
 

"background-color: #FFFFBB;"
                "color: #000099;"
                "margin: 10px;"
                "padding: 5px;"
                "padding-left: 15px;"
                "padding-right: 15px;"
                "border-radius: 5px;" // 圆角边框(只用IE的人就不知道了吧:D)
                "border: 3px solid #abc;"
 
 
这只是基础,其他的可根据实际情况,按帮助asstiant上的说明写
posted @ 2012-07-09 17:18 米米 阅读(305) | 评论 (0)编辑 收藏

QScopedPointer介绍

QScopedPointer

就分配空间和释放空间而言,Qt的处理有点乏味,要不然是通过隐式共享的containers,要不然就是通过QObject的父子关系模式。但总有些时候我们需要在堆上分配一些空间,问题来了,我们该在哪里delete它,如何能够确保不产生内存泄露呢?
QScopedPointer就为了解决这个问题而生的,哈哈 QScopedPointer在其生命期结束后会自动删除它所指的对象。

  1. void foo()
  2. {
  3. QScopedPointer<int> i(new int(42));
  4.     …
  5.     if (someCondition)
  6.         return; // 我们在堆上构造的整数这时会在这里删除或者是在下面
  7.     …
  8. } // … 也可能在这里

复制代码

这样就可以确保我们在堆上为整数42分配的空间不会产生内存泄露,同时我们也不用手动delete它,哈哈。
那我们如何访问QScopedPointer 所指的对象呢?QScopedPointer重新实现了operator* 和operator->,因此我们可以像下面这样使用它:

  1. QScopedPointer<int> i(new int(42));
  2.     *i = 43;

复制代码

有些运算符是不支持的,如赋值运算符:

  1. QScopedPointer<int> i(new int(42));
  2.     i = new int(43); // 编译不通过
  3.     i.reset(new int(43)); // 正确

复制代码

operator T*()也是没有的:

  1. int *foo()
  2. {
  3. QScopedPointer<int> i(new int(42));
  4.     …
  5.     return i; // thankfully, this does not compile.
  6. }

复制代码

看到错误没?在上面的代码中一旦我们return,我们构造的对象将被删除因为i的生命期已经结束,我们将会返回一个野指针,这可能会导致崩溃。如果真要返回我们应该像下面这样:

  1. int *foo()
  2. {
  3. QScopedPointer<int> i(new int(42));
  4.     …
  5.     if (someError)
  6.         return 0; // our integer is deleted here
  7.     return i.take(); // from now on, our heap object is on its own.
  8. }

复制代码

通过调用take()方法,我们告诉QScopedPointer它的工作已经做完,现在由我们来接管在堆上分配对象的所有权,哈哈
上面的只是针对new而言的,那么如果是malloc或者operator new[]构造数组呢?这里我们需要使用QScopedPointer的第二个参数:

  1. QScopedPointer<int, QScopedPointerPodDeleter> pod(static_cast<int *>(malloc(sizeof int)));

复制代码

但QScopedPointer生命期结束后QScopedPointerPodDeleter (pod 是 “plain old data”的缩写) 会调用free来释放我们分配的空间。
为了方便我们有一个专门针对数组的类,QScopedArrayPointer,在其生命期结束后会自动调用delete[]方法:

  1. void foo()
  2. {
  3.     QScopedArrayPointer<int> i(new int[10]);
  4.     i[2] = 42;
  5.     …
  6.     return; // our integer array is now deleted using delete[]
  7. }

复制代码

注意如果你有一个引用计数的对象,可以使用QExplicitlySharedDataPointer来确保当其引用计数为0时正确删除。
在 Qt的S60分支中,QScopedPointe 和QExplicitlySharedDataPointer已经得到了广泛的使用。相信不久就可以加入Qt的总分支中。通过使用Qt的这些智能指针,我 们可以让我们的程序更易读同时也不用过于担心,因为这些方法都是inline内联的。

 

 

经常这么用

class MyPrivateClass; // forward declare MyPrivateClass

class MyClass
{
private:
    QScopedPointer<MyPrivateClass> privatePtr; // QScopedPointer to forward declared class

public:
    MyClass(); // OK
    inline ~MyClass() {} // VIOLATION - Destructor must not be inline

private:
    Q_DISABLE_COPY(MyClass) // OK - copy constructor and assignment operators
                             // are now disabled, so the compiler won't implicitely
                             // generate them.
};

posted @ 2012-07-03 10:19 米米 阅读(712) | 评论 (0)编辑 收藏

仅列出标题
共8页: 1 2 3 4 5 6 7 8