创建对话框
来源:互联网 发布:2017达内网络视频课程 编辑:程序博客网 时间:2024/06/05 05:02
2.1 子类化QDialog
finddialog.h
//防止对头文件的多重包含#ifndef _FINDDIALOG_H_#define _FINDDIALOG_H_//QDialog是基类#include <QDialog>//前向声明 只能使用指针或者引用//不用包含类定义中的所有细节//但是分配空间时必须在finddialog.cpp中进行定义class QCheckBox;class QLabel;class QLineEdit;class QPushButton;//QDialog是基类 继承自QWidget//QLineEdit与QDialog是同等地位//FindDialog是QDialog的子类class FindDialog:public QDialog{ //定义了信号和槽的类 必须使用 Q_OBJECT Q_OBJECTpublic: //构造函数,parent为父窗口,参数默认值是一个空指针 //意味着没有父对象 FindDialog(QWidget *parent = 0);signals: //Qt::CaseSensitivity表示匹配的灵敏度 是否区分大小写 //signals部分表明点击Find按钮所发射的信号 //Qt::CaseSensitivity是一个枚举类型 //Qt::casesensitive qt::caseInsensitive void findNext(const QString &str,Qt::CaseSensitivity cs); void findPrevious(const QString &str,Qt::CaseSensitivity cs);private slots: void findClicked(); void enableFindButton(const QString &text);private: QLabel *label; QLineEdit *lineEdit; QCheckBox *caseCheckBox; QCheckBox *backwardCheckBox; QPushButton *findButton; QPushButton *closeButton;};#endif
finddialog.cpp//包含了Qt GUI类的定义 如:QLabel#include <QtGui>#include "finddialog.h"FindDialog::FindDialog(QWidget *parent) :QDialog(parent){ label = new QLabel(tr("Find &what:")); lineEdit = new QLineEdit(); //将Lineedit设置为label的伙伴 焦点。 label->setBuddy(lineEdit); caseCheckBox = new QCheckBox(tr("Match &case")); backwardCheckBox = new QCheckBox(tr("Search &backard")); findButton = new QPushButton(tr("&Find")); //成为对话框的默认按钮 按下'enter'时候能够按下对应按钮 findButton->setDefault(true); //不可编辑 findButton->setEnabled(false); closeButton = new QPushButton(tr("Close")); //由于Qobject是FindDialog的父对象 所以可以省去前缀 connect(lineEdit,SIGNAL(textChanged(const QString &)), this,SLOT(enableFindButton(const QString &))); connect(findButton,SIGNAL(click()), this,SLOT(findClicked())); connect(closeButton,SIGNAL(clicked()), this,SLOT(close())); //设置布局 //布局管理器类的精妙之处在于他们不是窗口部件 //所以能很好的区分窗口部件和布局 //当子布局对象添加到父布局对象中,能够自动重定义自己的父对象 QHBoxLayout *topLeftLayout = new QHBoxLayout; topLeftLayout->addWidget(label); topLeftLayout->addWidget(lineEdit); QVBoxLayout *leftLayout = new QVBoxLayout; //注意 是addLayout leftLayout->addLayout(topLeftLayout); leftLayout->addWidget(caseCheckBox); leftLayout->addWidget(backwardCheckBox); QVBoxLayout *rightLayout = new QVBoxLayout; rightLayout->addWidget(findButton); rightLayout->addWidget(closeButton); //stretch分隔符 rightLayout->addStretch(); QHBoxLayout *mainLayout = new QHBoxLayout; mainLayout->addLayout(leftLayout); mainLayout->addLayout(rightLayout); setLayout(mainLayout); setWindowTitle(tr("Find")); //sizehint返回一个理想的高度 setFixedHeight(sizeHint().height());}//没必要写析构函数 因为删除父对象的同时会删除所有的子对象void FindDialog::findClicked(){ QString text = lineEdit->text(); Qt::CaseSensitivity cs = caseCheckBox->isChecked() ? Qt::CaseSensitive : Qt::CaseInsensitive; if(backwardCheckBox->isChecked()) { //emit是qt关键字,会被预处理为标准的c++代码 emit findPrevious(text,cs); } else { emit findNext(text,cs); }}void FindDialog::enableFindButton(const QString &text){ //不空的话 findButton->setEnabled(!text.isEmpty());}
main.cpp
#include <QApplication>#include "finddialog.h"int main(int argc, char *argv[]){ QApplication app(argc,argv); FindDialog *dialog = new FindDialog; dialog->show(); return app.exec();}
2.2 深入介绍信号和槽
槽和普通的C++成员函数是一样的——可以是虚函数;可以被重载,也可以是私有的、公有的、或者是保护的
并且可以被其他c++成员函数直接调用
注:
1、一个信号可以连接多个槽 但是发射信号的时候会以不确定的顺序一个接一个地调用这些槽
2、多个信号可以连接同一个槽
3、一个信号还可以与另一个信号想连接
connect(lineEdit,SIGNAL(),this,SIGNAL())
4、连接可以被移除
disconnect(lcd,SIGNAL(),this,SLOT())
//很少用到,因为当删除对象时, 会自动移除和这个对象相关的所有连接
要把信号成功连接到槽或者是另外一个信号,她们的参数必须有相同的顺序和相同的类型。 如果参数较多,则会被忽略掉
信号和槽不仅仅只是在窗口部件中可以用,这个机制是在QObject中实现的,可以用于QObject的子类中 例如
class Employee:public QObject{ Q_OBJECT public: Employee() { mySlary = 0; } int salary()const { return mySalary; }public slots: void setSalary(int newSalary); signals: void salaryChanged(int newSalary);private: int mySalary;};void Employee::setSalary(int newSalary){ //只有在newSalary != mySalary的时候猜发射信号 //确保循环连接不会导致无限循环 if( newSalary!= mySalary) { mySalary = newSalary; emit salaryChanged(mySalary); }}
0 0
- 创建对话框
- 创建对话框
- 创建对话框
- 创建模块化对话框
- 创建一个对话框
- 创建简单对话框
- 创建非模态对话框
- 创建非模态对话框
- 创建无模式对话框
- 线程中创建对话框
- 创建对话框.
- 创建模式对话框
- 创建modeless对话框
- 为对话框创建工具栏
- 创建浏览对话框
- 创建非模态对话框
- 创建无模式对话框
- 创建提示对话框
- Git入门指南四:跟踪新文件和忽略某些文件
- POJ-2718-Smallest Difference
- ASP.NET中XML转JSON的方法
- java 字符串null与isEmpty()
- C语言条件编译
- 创建对话框
- 编程之美学习过程积累
- navicat8_mysql_cs 注册码
- UVA 1366 - Martian Mining(dp)
- apache安装
- C#封装的海康DVR客户端SDK
- IOS 发送短信实现
- OCP-1Z0-053-V13.02-402题
- C#封装的海康DVR客户端SDK