QT经验总结

来源:互联网 发布:淘宝会员等级 编辑:程序博客网 时间:2024/05/21 10:14
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文件,根据提示删除某一语句

0 0