青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

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 米米 閱讀(5211) | 評論 (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 米米 閱讀(459) | 評論 (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 米米 閱讀(702) | 評論 (0)編輯 收藏

lrelease  zhu_zh.ts 1_zh.ts -qm aaa.qm
posted @ 2012-08-02 16:37 米米 閱讀(255) | 評論 (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 米米 閱讀(1044) | 評論 (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 米米 閱讀(2122) | 評論 (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 米米 閱讀(1062) | 評論 (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 米米 閱讀(1209) | 評論 (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 米米 閱讀(337) | 評論 (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 米米 閱讀(767) | 評論 (0)編輯 收藏

僅列出標題
共8頁: 1 2 3 4 5 6 7 8 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            蜜桃av一区二区三区| 欧美电影免费观看高清完整版| 亚洲欧洲一区二区三区在线观看| 亚洲一区欧美二区| 欧美伊人久久大香线蕉综合69| 国产精品欧美日韩一区二区| 亚洲永久免费观看| 一本色道久久综合亚洲二区三区 | 欧美aaa级| 洋洋av久久久久久久一区| 久久久久国产精品人| 亚洲大胆人体在线| 欧美日韩三级| 久久激情视频| 日韩亚洲一区二区| 久久综合久久久久88| 亚洲欧美成人精品| 亚洲日本黄色| 国产综合自拍| 欧美性大战久久久久久久蜜臀| 久久精品日产第一区二区| 亚洲一区三区视频在线观看| 欧美一区三区二区在线观看| 亚洲免费久久| 亚欧美中日韩视频| 欧美另类一区| 欧美成人国产va精品日本一级| 欧美亚洲免费| 欧美承认网站| 国模私拍视频一区| 亚洲午夜在线观看| 91久久久在线| 亚洲第一中文字幕在线观看| 在线综合+亚洲+欧美中文字幕| 在线成人激情| 国内久久精品视频| 一区二区三区高清在线| 你懂的国产精品| 欧美激情a∨在线视频播放| 欧美成人免费全部观看天天性色| 中文日韩在线| 午夜精品电影| 午夜伦理片一区| 午夜在线播放视频欧美| 欧美精品日韩一本| 欧美天堂亚洲电影院在线观看 | 一区二区三区自拍| 国产一区二区三区四区五区美女| 久久岛国电影| 欧美午夜精品久久久久免费视 | 欧美亚洲免费电影| 久久久91精品| 亚洲视频一起| 欧美四级剧情无删版影片| 亚洲免费成人av电影| 一本久久知道综合久久| 一本色道久久综合狠狠躁篇的优点 | 欧美第一黄色网| 久久久久国产一区二区| 亚洲小视频在线| 亚洲成人自拍视频| 亚洲素人在线| 日韩一区二区免费高清| 亚洲国产网站| 亚洲人成毛片在线播放女女| 欧美在线关看| 亚洲综合999| 午夜精品久久久久久久久| 欧美四级在线观看| 亚洲一区免费网站| 久久精品国产亚洲a| 久久久久国产一区二区三区四区 | 一本一道久久综合狠狠老精东影业| 欧美精品久久久久久久免费观看| 亚洲精品日韩久久| 亚洲精品免费在线| 亚洲免费视频观看| 国产日韩欧美电影在线观看| 亚洲国产精品久久91精品| 久久午夜影视| 亚洲丝袜av一区| 久久gogo国模啪啪人体图| 久久中文欧美| 国产精品爱啪在线线免费观看| 一区二区欧美精品| 日韩天堂在线观看| 国产日产欧产精品推荐色| 亚洲国产精品视频一区| 欧美激情在线有限公司| 亚洲国产精品悠悠久久琪琪| 亚洲色诱最新| 国产精品久久91| 日韩视频免费观看| 夜夜嗨av一区二区三区网站四季av| 国产精品三上| 亚洲视频在线观看| 久久人人爽人人爽| 欧美激情按摩在线| 欧美日韩国产精品成人| 国产真实久久| 亚洲国产高清自拍| 卡一卡二国产精品| 亚洲已满18点击进入久久| 性色av香蕉一区二区| 亚洲精品偷拍| 欧美在线亚洲一区| 一区二区三区免费看| 欧美一区亚洲二区| 99精品福利视频| 久久精品久久99精品久久| 亚洲精品一区二区三区樱花| 欧美亚洲免费| 亚洲欧美日本国产有色| 欧美高清视频一区| 亚洲乱码国产乱码精品精98午夜| 亚洲视频在线二区| 亚洲精品久久久一区二区三区| 亚洲一区在线看| 这里只有精品在线播放| 美国十次成人| 麻豆精品精华液| 久久夜色精品国产欧美乱| 亚洲一区欧美激情| 欧美极品在线播放| 欧美激情网站在线观看| 雨宫琴音一区二区在线| 欧美专区日韩视频| 久久久久高清| 国内精品亚洲| 久久久亚洲综合| 美女精品视频一区| 欧美高潮视频| 亚洲第一精品久久忘忧草社区| 国模精品娜娜一二三区| 欧美一区亚洲| 久久综合九色综合网站| 在线观看日韩一区| 你懂的一区二区| 亚洲国产综合视频在线观看| 91久久久久久| 欧美日韩不卡| 一本一本久久a久久精品牛牛影视| 一区二区三区四区五区视频| 欧美揉bbbbb揉bbbbb| 99国产精品久久久久老师| 亚洲午夜视频| 国产亚洲精品久久飘花| 欧美影院成年免费版| 免费毛片一区二区三区久久久| 国产一区二区三区在线观看网站 | 欧美一区二区视频在线观看| 亚洲男女自偷自拍| 国产麻豆精品theporn| 理论片一区二区在线| 国产婷婷色一区二区三区四区 | 欧美日韩精品免费看| 一本色道久久综合亚洲精品婷婷 | 欧美亚洲综合网| 国产在线国偷精品产拍免费yy| 久久国产精品亚洲77777| 欧美成人在线免费观看| 亚洲免费av观看| 国产精品v欧美精品v日韩 | 亚洲成人在线视频网站| 免费久久99精品国产自| 日韩亚洲国产欧美| 久久久国产精品一区二区三区| 亚洲第一主播视频| 欧美日韩影院| 久久精品国产一区二区三区免费看 | 你懂的亚洲视频| 99国产精品自拍| 久久亚洲精品一区| 一本久久综合| 国产亚洲综合精品| 欧美激情中文字幕一区二区| 亚洲女同性videos| 亚洲国产第一| 久久久久中文| 亚洲欧美日韩精品在线| 最新亚洲视频| 国产午夜精品视频免费不卡69堂| 欧美国产三级| 久久久久久久久一区二区| 一本大道av伊人久久综合| 嫩草影视亚洲| 久久免费99精品久久久久久| 亚洲午夜国产一区99re久久| 永久久久久久| 国产日韩专区| 欧美小视频在线| 欧美搞黄网站| 久久精品视频播放| 午夜精品久久久久久久蜜桃app| 亚洲美女精品一区| 亚洲国产裸拍裸体视频在线观看乱了中文 | 久久久久久久网| 亚洲欧美激情精品一区二区| 亚洲国产一区二区三区在线播| 久久精品国产99|