• <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>

            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 米米 閱讀(5190) | 評論 (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 米米 閱讀(436) | 評論 (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 米米 閱讀(685) | 評論 (0)編輯 收藏

            lrelease  zhu_zh.ts 1_zh.ts -qm aaa.qm
            posted @ 2012-08-02 16:37 米米 閱讀(247) | 評論 (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 米米 閱讀(1028) | 評論 (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 米米 閱讀(2098) | 評論 (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 米米 閱讀(1039) | 評論 (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 米米 閱讀(1190) | 評論 (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 米米 閱讀(322) | 評論 (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 米米 閱讀(749) | 評論 (0)編輯 收藏

            僅列出標題
            共8頁: 1 2 3 4 5 6 7 8 
            中文字幕无码久久人妻| 久久国产热精品波多野结衣AV| 久久久久久亚洲精品不卡 | 久久亚洲AV成人无码| 亚洲精品国产字幕久久不卡| 久久久青草青青亚洲国产免观| 久久久精品视频免费观看| 久久人人爽人人爽人人片AV东京热| 精品久久久久久国产潘金莲| 尹人香蕉久久99天天拍| 亚洲一本综合久久| 人妻无码精品久久亚瑟影视| 国产三级精品久久| 男女久久久国产一区二区三区| 久久久久女教师免费一区| 久久精品中文騷妇女内射| 噜噜噜色噜噜噜久久| 国产精品欧美久久久久无广告 | 久久国产精品一区二区| 亚洲国产日韩综合久久精品| 国产精品一区二区久久精品无码| 久久综合精品国产二区无码| 亚洲第一永久AV网站久久精品男人的天堂AV| 久久精品国产亚洲AV麻豆网站| 精品国产乱码久久久久软件| 久久国产综合精品五月天| 久久精品国产精品国产精品污| 亚洲中文字幕无码久久精品1| 日本亚洲色大成网站WWW久久 | 狠狠色综合网站久久久久久久| 欧美熟妇另类久久久久久不卡| 久久久久久久久久久| 久久精品无码一区二区WWW| 亚洲精品视频久久久| 人人狠狠综合久久亚洲高清| 欧美精品丝袜久久久中文字幕 | 久久WWW免费人成—看片| 久久美女网站免费| 久久久噜噜噜久久| 亚洲精品WWW久久久久久| 国产69精品久久久久9999APGF|