QT經驗總結
1.一個槽可以連接多個信號,一個信號可以連接多個槽
2.信號在發射之前必須連接,否則發射信號不會生效
3.如果connect連接不成功,主要有兩個原因:一.對象錯了,或者new了多個對象;二:信號在連接之前發射信號
4.設置背景圖片:
ui->pushButton_5->setStyleSheet("QPushButton#pushButton_5{border-image:url(:/IMAGE/OrderSystem_image/1.png)}"); //關閉
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.設置密碼爲黑點:
ui->lineEdit_2->setEchoMode(QLineEdit::Password);
8.最小化:
this->showMinimized();
9.去掉標題欄
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();
}
如果幾個槽被連接到一個信號,當信號被髮射時,這些槽就會被按任意順序一個接一個地執行。
14.使用信號與槽需要注意的問題:
1.信號和槽的效率是非常高的,不過同真正的回調函數比較起來,由於增加了靈活性,因此在速度上還是有所損失,當然這種損失相對來說是比較小的,通過在一臺 i586-133的機器上測試是10微秒(運行Linux),可見這種機制所提供的簡潔性、靈活性還是值得的。但如果我們要追求高效率的話,比如在實時系統中就要儘可能的少用這種機制。
2.信號和槽機制和普通函數的調用相同,如果使用不當的話,在程式執行時也有可能產生死循環。因此,在定義槽函數時一定要注意避免間接形成無限循環,即在槽中再次發射所接收到的同樣信號。
3.如果一個信號和多個槽相聯繫的話,那麼當這個信號被髮射時,和之相關的槽被激活的順序將是隨機的。
4. 宏定義不能用在signal和slot的參數中。 既然moc工具不擴展#define,因此,在signals和slots中攜帶參數的宏就不能正確地工作,如果不帶參數是能的。
5. 構造函數不能用在signals或slots聲明區域內。的確,將一個構造函數放在signals或slots區內有點不可理解,無論怎麼,不能將他們放在private slots、protected slots或public slots區內。
6. 函數指針不能作爲信號或槽的參數。
你能採用下面的方法繞過這個限制:
typedef void (*ApplyFunctionType)(QList*, void*);
class someClass : public QObject
{ Q_OBJECT […]
public slots: void apply( ApplyFunctionType, char *);
};
7.信號和槽不能有缺省參數。
既然signal->slot綁定是發生在運行時刻,那麼,從概念上講使用缺省參數是困難的。下面的用法是不合理的: class SomeClass : public QObject
{ Q_OBJECT
public slots:
void someSlot(int x=100); // 將x的缺省值定義成100,在槽函數聲明中使用是錯誤的
};
8.信號和槽也不能攜帶模板類參數。
如果將信號、槽聲明爲模板類參數的話,即使moc工具不報告錯誤,也不可能得到預期的結果。
例如,下面的例子中當信號發射時,槽函數不會被正確調用: […]
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); 這樣使用的話,你就能得到正確的結果。
9.嵌套的類不能位於信號或槽區域內,也不能有信號或槽。
例如,下面的例子中,在class B中聲明槽b()是不合語法的,在信號區內聲明槽b()也是不合語法的。
class A { Q_OBJECT public: class B { public slots: // 在嵌套類中聲明槽不合語法 void b(); [….] }; signals: class B { // 在信號區內聲明嵌套類不合語法 void b(); [….] }: };
10.友元聲明不能位於信號或槽聲明區內。相反,他們應該在普通C++的private、protected或public區內進行聲明。
下面的例子是不合語法規範的: class someClass : public QObject { Q_OBJECT […] signals: //信號定義區 friend class ClassTemplate; // 此處定義不合語法 };
11.信號與槽只能是void類型,而且信號與槽是沒有函數返回值得。信號只需聲明,無需實現,而槽必須實現。空實現也是實現。
12.信號的參數類型與槽的參數類型必須相同,但是信號的參數個數一定要大於等於槽的參數個數。
13.要在qt中使用數據庫或者其他技術時,記得在.pro文件中加入數據庫語句sql。例如:QT += core gui sql
QT常見錯誤總結:
1.報資源文件“no rule to target .......”時,記住要看一看.pro文件,根據提示刪除某一語句
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.