QT常用技術(shù)經(jīng)驗總結(jié): 1.一個槽可以連接多個信號,一個信號可以連接多個槽 2.信號在發(fā)射之前必須連接,否則發(fā)射信號不會生效 3.如果connect連接不成功,主要有兩個原因:一.對象錯了,或者new了多個對象;二:信號在連接之前發(fā)射信號 4.設(shè)置背景圖片: ui->pushButton_5->setStyleSheet("QPushButton#pushButton_5{border-image:url(:/IMAGE/OrderSystem_image/1.png)}"); //關(guān)閉 5.加載qss文件: QFile file(":/qss/change_color/change_color3.qss"); file.open(QFile::ReadOnly); QString stylesheet=QLatin1String(file.readAll()); setStyleSheet(stylesheet); file.close(); 6.彈出對話框: #include <QFileDialog> QString filename=QFileDialog::getOpenFileName(); QFile file(filename); file.open(QFile::ReadOnly); QString stylesheet=QLatin1String(file.readAll()); setStyleSheet(stylesheet); file.close(); 7.設(shè)置密碼為黑點: ui->lineEdit_2->setEchoMode(QLineEdit::Password); 8.最小化: this->showMinimized(); 9.去掉標(biāo)題欄 this->setWindowFlags(Qt::FramelessWindowHint); 10.獲取combox中的值: QString a=ui->comboBox->currentText(); 11.子界面最好在總界面中show(), 12.如果子界面要和總界面使用信號與槽通訊,那么connect連接必須在總界面中,因為連接中必須使用總界面和子界面的對象,如果在子界面中連接的話,就必須在子界面中new一個總界面的對象 13.從QObject類或者它的一個子類(比如QWidget類)繼承的所有類可以包含信號和槽,例如 class ClientView :public QObject { Q_OBJECT//要使用信號與槽,這句代碼和繼承QObject是必須的 public: ClientView(); ~ClientView(); } 如果幾個槽被連接到一個信號,當(dāng)信號被發(fā)射時,這些槽就會被按任意順序一個接一個地執(zhí)行。 14.使用信號與槽需要注意的問題: 1.信號和槽的效率是非常高的,不過同真正的回調(diào)函數(shù)比較起來,由于增加了靈活性,因此在速度上還是有所損失,當(dāng)然這種損失相對來說是比較小的,通過在一臺 i586-133的機(jī)器上測試是10微秒(運行Linux),可見這種機(jī)制所提供的簡潔性、靈活性還是值得的。但如果我們要追求高效率的話,比如在實時系統(tǒng)中就要盡可能的少用這種機(jī)制。 2.信號和槽機(jī)制和普通函數(shù)的調(diào)用相同,如果使用不當(dāng)?shù)脑?,在程式?zhí)行時也有可能產(chǎn)生死循環(huán)。因此,在定義槽函數(shù)時一定要注意避免間接形成無限循環(huán),即在槽中再次發(fā)射所接收到的同樣信號。 3.如果一個信號和多個槽相聯(lián)系的話,那么當(dāng)這個信號被發(fā)射時,和之相關(guān)的槽被激活的順序?qū)⑹请S機(jī)的。 4. 宏定義不能用在signal和slot的參數(shù)中。 既然moc工具不擴(kuò)展#define,因此,在signals和slots中攜帶參數(shù)的宏就不能正確地工作,如果不帶參數(shù)是能的。 5. 構(gòu)造函數(shù)不能用在signals或slots聲明區(qū)域內(nèi)。的確,將一個構(gòu)造函數(shù)放在signals或slots區(qū)內(nèi)有點不可理解,無論怎么,不能將他們放在private slots、protected slots或public slots區(qū)內(nèi)。 6. 函數(shù)指針不能作為信號或槽的參數(shù)。 你能采用下面的方法繞過這個限制: typedef void (*ApplyFunctionType)(QList*, void*); class someClass : public QObject { Q_OBJECT […] public slots: void apply( ApplyFunctionType, char *); }; 7.信號和槽不能有缺省參數(shù)。 既然signal->slot綁定是發(fā)生在運行時刻,那么,從概念上講使用缺省參數(shù)是困難的。下面的用法是不合理的: class SomeClass : public QObject { Q_OBJECT public slots: void someSlot(int x=100); // 將x的缺省值定義成100,在槽函數(shù)聲明中使用是錯誤的 }; 8.信號和槽也不能攜帶模板類參數(shù)。 如果將信號、槽聲明為模板類參數(shù)的話,即使moc工具不報告錯誤,也不可能得到預(yù)期的結(jié)果。 例如,下面的例子中當(dāng)信號發(fā)射時,槽函數(shù)不會被正確調(diào)用: […] public slots: void MyWidget::setLocation (pair location); […] public signals: void MyObject::moved (pair location); 不過,你能使用typedef語句來繞過這個限制。如下所示: typedef pair IntPair; […] public slots: void MyWidget::setLocation (IntPair location); […] public signals: void MyObject::moved (IntPair location); 這樣使用的話,你就能得到正確的結(jié)果。 9.嵌套的類不能位于信號或槽區(qū)域內(nèi),也不能有信號或槽。 例如,下面的例子中,在class B中聲明槽b()是不合語法的,在信號區(qū)內(nèi)聲明槽b()也是不合語法的。 class A { Q_OBJECT public: class B { public slots: // 在嵌套類中聲明槽不合語法 void b(); [….] }; signals: class B { // 在信號區(qū)內(nèi)聲明嵌套類不合語法 void b(); [….] }: }; 10.友元聲明不能位于信號或槽聲明區(qū)內(nèi)。相反,他們應(yīng)該在普通C++的private、protected或public區(qū)內(nèi)進(jìn)行聲明。 下面的例子是不合語法規(guī)范的: class someClass : public QObject { Q_OBJECT […] signals: //信號定義區(qū) friend class ClassTemplate; // 此處定義不合語法 }; 11.信號與槽只能是void類型,而且信號與槽是沒有函數(shù)返回值得。信號只需聲明,無需實現(xiàn),而槽必須實現(xiàn)??諏崿F(xiàn)也是實現(xiàn)。 12.信號的參數(shù)類型與槽的參數(shù)類型必須相同,但是信號的參數(shù)個數(shù)一定要大于等于槽的參數(shù)個數(shù)。 13.要在qt中使用數(shù)據(jù)庫或者其他技術(shù)時,記得在.pro文件中加入數(shù)據(jù)庫語句sql。例如:QT += core gui sql QT常見錯誤總結(jié): 1.報資源文件“no rule to target .......”時,記住要看一看.pro文件,根據(jù)提示刪除某一語句 |
|