当前位置:文档之家› Qt基础教程之登录窗体(Splash窗口)设计

Qt基础教程之登录窗体(Splash窗口)设计

Qt基础教程之登录窗体(Splash窗口)设计
Qt基础教程之登录窗体(Splash窗口)设计

一般的大型应用程序在启动时会显示一个启动画面,即 Splash 窗口。

Splash 窗口是一个无边对话框,一般显示一个图片,展示软件的信息。Splash 窗口显示时,程序在后台做一些比较耗时的启动准备工作,Splash 窗口显示一段时间后自动关闭,然后软件的主窗口显示出来。QT有一个 QSplashScreen 类可以实现 Splash 窗口的功能,它提供了载入图片,自动设置窗口无边框效果等功能。

Splash 窗口和登录界面实质都是对话框,它们在程序启动时显示。本节设计一个基与上节增加了一个 Splash 登录对话框,这个对话框结合了 Splash 窗口和登录界面两者的功能,实例运行时的启动界面如图 1 所示。

图 1 Splash 和登录窗口

这个实例演示如下的一些功能的实现方法:

?如何实现 Splash 特点的无边框对话框;

?如何设计用鼠标拖动无边框的对话框;

?如何使用 QSettings 类存储用户名、密码等信息;

?如何用 QCryptographicHash 类进行字符串加密;

?如何根据登录输入状况确定启动主窗口或终止程序运行。

对话框界面设计和类定义

釆用新建Qt Designer Form Class 的方法创建启动登录对话框,它从

QDialog 继承而来,设置类名称为 QDlgLogin。界面设计在 UI 设计器里进行,主要区域是一个用于显示图片的 QLabel 组件,在资源文件里载入图片,为

QLabel 组件的 pixmap 指定图片。

对话框下方是用于用户名和密码输入的 QLineEdit 组件,两个按钮用于选择用户输入,设置“取消”按钮的 clicked() 信号与对话框的 reject() 槽函数关联。但是“确定”按钮的 clicked() 信号不要设置为与对话框的任何槽函数关联,需要对其编写自定义的槽函数代码,因为需要根据用户输入确定对话框返回结果。为对话框界面上的组件设置好布局。

下面是 qdlglogin.h 文件中 QDlgLogin 类的定义:

1.class QDlgLogin : public QDialog

2.{

3. Q_OBJECT

4.private:

5. bool m_moving=false;//表示窗口是否在鼠标操作下移动

6. QPoint m_lastPos; //上一次的鼠标位置

7. QString m_user="user"; //初始化用户名

8. QString m_pswd="12345";//初始化密码,未加密的

9. int m_tryCount=0; //试错次数

10. void readSettings(); //读取设置,从注册表

11. void writeSettings();//写入设置,从注册表

12. QString encrypt(const QString& str);//字符串加密

13.protected:

14.//用于鼠标拖动窗口的鼠标事件操作

15. void mousePressEvent(QMouseEvent *event);

16. void mouseMoveEvent(QMouseEvent *event);

17. void mouseReleaseEvent(QMouseEvent *event);

18.public:

19.explicit QDlgLogin(QWidget *parent = 0);

20. ~QDlgLogin();

21.private slots:

22. void on_btnOK_clicked(); //OK按键

23.private:

24. Ui::dlgLogin *ui;

25.};

在 QDlgLogin 类中,定义了一些私有成员变量:

?m_moving 和 m_lastPos 用于在拖动窗口时记录移动状态和上次的位置,由于Splash 窗口没有标题栏,所以采用在图片上拖拉的方式移动窗口,使用了 3 个鼠标事件来实现窗口拖动操作。

?m_user, m_pswd,m_tryCount 用于记录用户名、密码和试错次数。?readSettings() 用于读取存储的设置,writeSettings() 用于将设置存储,在Windows 系统下,这些信息是存储在注册表里的。

?encrypt() 函数用于对一个字符串进行加密。

QDlgLogin类功能实现

构造函数里的初始化

QDlgLogin 类的构造函数代码如下:

1.QDlgLogin::QDlgLogin(QWidget *parent) :

2. QDialog(parent),

3. ui(new Ui::dlgLogin)

4.{

5. ui->setupUi(this);

6.

7. ui->editPSWD->setEchoMode(QLineEdit::Password); //密码输入编辑框设置为密码输入模

8.this->setAttribute(Qt::WA_DeleteOnClose);//设置为关闭时删除

9.this->setWindowFlags(Qt::SplashScreen); //设置为SplashScreen, 窗口无边框,不在任务栏显

10. //this->setWindowFlags(Qt::FramelessWindowHint);//无边框,但是在任务显示对话框标题

11. readSettings(); //读取存储的用户名和密码

12.}

QLineEdit::setEchoMode() 函数设置编辑框回显方式,参数为

QLineEdit::EchoMode 枚举类型,这里设置为 QLineEditiPassword 回显方式,用于将密码输入回显为一个符号,而不显示真实字符。

使用 setWindowFlags() 函数将窗口标志设置为 Qt::SplashScreen,这样对话框显示为 Splash 窗口,无边框,且在 Windows 任务栏上没有显示。另外一个类似的标志是 Qt::FramelessWindowHint,它会使对话框无边框,但是会在任务栏上显示对话框的标题。

初始设置后调用 readSettings() 函数读取存储的设置,根据存储的情况将用

户名显示到窗口上的编辑框里。

应用程序设置的存储

自定义成员函数 readSettings() 用于读取应用程序设置,writeSettings() 用于保存设置,实现代码如下:

1.void QDlgLogin::readSettings()

2.{//读取存储的用户名和密码, 密码是经过加密的

3. QString organization="WWB-Qt";//用于注册表,

4. QString appName="samp6_5"; //HKEY_CURRENT_USER/Software/WWB-Qt/amp6_5

5. QSettings settings(organization,appName);//创建

6. bool saved=settings.value("saved",false).toBool();//读取 saved键的值

7. m_user=settings.value("Username", "user").toString();//读取Username 键的值,缺省为“user”

8. QString defaultPSWD=encrypt("12345"); //缺省密码"12345"加密后的数据

9. m_pswd=settings.value("PSWD",defaultPSWD).toString();//读取PSWD 键的值,

10.if (saved)

11. ui->editUser->setText(m_user);

12.

13. ui->chkBoxSave->setChecked(saved);

14.}

15.

16.void QDlgLogin::writeSettings()

17.{ //保存用户名,密码等设置

18. QSettings settings("WWB-Qt","samp6_5"); //注册表键组

19. settings.setValue("Username",m_user); //用户名

20. settings.setValue("PSWD",m_pswd); //密码,经过加密的

21. settings.setValue("saved",ui->chkBoxSave->isChecked());

22.}

应用程序的设置是指应用程序需要保存的一些信息,在 Windows 系统下,这些信息保存在注册表里。使用 QSettings 类可以实现设置信息的读取和写入。

创建 QSettings 对象时,需要传递 organization 和 appName,例如:

指向的注册表目录是HKEY_CURRENTJJSER/Software/WWB-Qt/samp6_5。

注册表里参数是以“键-键值”对来保存的。writeSettings() 函数里使用setValue() 函数写入键值,readSettings() 里使用 value() 函数读取键值。

读取键值时可以指定缺省值,即如果键不存在,就用缺省值作为读取的值。

在 Windows 的开始菜单的输入框里输入 regedit,打开注册表,查找到目录HKEY_CURRENT_USER/Software/WWB-Qt/samp6_5,可以看到注册表里参数存储情况。其中,存储的密码是加密后的字符串。

字符串加密

本实例中密码采用加密后的字符串保存,这样在实际应用中具有安全性。Qt 提供了用于加密的类 QCryptographicHash,自定义函数 encrypt() 就利用这个类进行字符串加密,实现代码如下:

1.QString QDlgLogin::encrypt(const QString &str)

2.{ //字符串MD5算法加密

3. QByteArray btArray;

4. btArray.append(str);//加入原始字符串

5. QCryptographicHash hash(QCryptographicHash::Md5); //Md5加密算法

6. hash.addData(btArray); //添加数据到加密哈希值

7. QByteArray resultArray =hash.result(); //返回最终的哈希值

8. QString md5 =resultArray.toHex();//转换为16进制字符串

9.return md5;

10.}

用户名和密码输入判断

登录窗口运行后,单击“确定”按钮,程序会对输入内容进行判断,“确定”

按钮的槽函数代码如下:

1.void QDlgLogin::on_btnOK_clicked()

2.{//"确定"按钮相应

3. QString user=ui->editUser->text().trimmed();//输入用户名

4. QString pswd=ui->editPSWD->text().trimmed(); //输入密码

5.

6. QString encrptPSWD=encrypt(pswd); //对输入密码进行加密

7.

8.if ((user==m_user)&&(encrptPSWD==m_pswd)) //如果用户名和密码正确

9. {

10. writeSettings();//保存设置

11.this->accept(); //对话框 accept(),关闭对话框

12. }

13.else

14. {

15. m_tryCount++; //错误次数

16.if (m_tryCount>3)

17. {

18. QMessageBox::critical(this, "错误", "输入错误次数太多,强行退出");

19.this->reject(); //退出

20. }

21.else

22. QMessageBox::warning(this, "错误提示", "用户名或密码错误");

23. }

24.}

由于 QCryptographicHash 只提供了加密功能,没有提供解密功能,所以,在读取应用程序设定后,无法将加密后的密码解密并显示在窗口上,程序只能回显用户名,而不能回显密码。

这段程序会对输入的密码进行加密,因为从注册表读取的是加密后的密码,所以能够对比输入的用户名和密码与存储的用户名和密码是否匹配。

如果输入正确,调用窗口的 accept() 槽函数关闭对话框,对话框返回值为QDialog::Accepted,否则试错次数加一;如果试错次数大于 3 次,就调用窗口的 reject() 槽函数关闭对话框,对话框返回值为 QDialog::Rejected。

窗口拖动功能的实现

由于 Splash 窗口没有边框,因此不能像普通的窗口那样通过拖动窗口的标题栏来拖动窗口。为了实现窗口的拖动功能,对窗口的 3 个鼠标事件进行处理,实现的代码如下:

1.void QDlgLogin::mousePressEvent(QMouseEvent *event)

2.{ //鼠标按键被按下

3.if (event->button() == Qt::LeftButton)

4. {

5. m_moving = true;

6. //记录下鼠标相对于窗口的位置

7. //event->globalPos()鼠标按下时,鼠标相对于整个屏幕位置

8. //pos() this->pos()鼠标按下时,窗口相对于整个屏幕位置

9. m_lastPos = event->globalPos() - pos();

10. }

11.return QDialog::mousePressEvent(event); //

12.}

13.

14.void QDlgLogin::mouseMoveEvent(QMouseEvent *event)

15.{//鼠标按下左键移动

16. //(event->buttons() && Qt::LeftButton)按下是左键

17. //鼠标移动事件需要移动窗口,窗口移动到哪里呢?就是要获取鼠标移动中,窗口在整

个屏幕的坐标,然后move到这个坐标,怎么获取坐标?

18. //通过事件event->globalPos()知道鼠标坐标,鼠标坐标减去鼠标相对于窗口位置,就是窗

口在整个屏幕的坐标

19.if (m_moving && (event->buttons() && Qt::LeftButton)

20. && (event->globalPos()-m_lastPos).manhattanLength() > QApplication::startDragDistance())

21. {

22. move(event->globalPos()-m_lastPos);

23. m_lastPos = event->globalPos() - pos();

24. }

25.return QDialog::mouseMoveEvent(event);

26.}

27.

28.void QDlgLogin::mouseReleaseEvent(QMouseEvent *event)

29.{//鼠标按键释放

30. m_moving=false; //停止移动

31.}

mousePressEvent(QMouseEvent *event) 事件在鼠标按键按下时发生,传递的参数 event 有鼠标按键和坐标信息,判断如果是鼠标左键按下,就设置变量m_moving 值为 true,表示开始移动,并记录下鼠标坐标。event->globalPos() 与对话框的 pos() 是不同坐标系下的坐标,在绘图这一章再详细介绍。

mouseMoveEvent(QMouseEvent *event) 事件在鼠标移动时发射,程序里判断是否己经开始移动并且按下鼠标左键;如果是,则调用窗口的 move() 函数,横向和纵向移动一定的距离,并再次记录坐标点。

mouseReleaseEvent(QMouseEvent *event) 事件在鼠标按键释放时发生,左键释放时停止窗口移动。

所以,当在窗口上按下鼠标左键并移动时,窗口就会随之移动。

Splash登录窗口的使用

设计好启动和登录窗口 QDlgLogin 之后,在 main() 函数里使用启动与登录对话框。main() 函数的代码如下:

1.int main(int argc, char *argv[])

2.{

3. QTextCodec *codec = QTextCodec::codecForName("UTF-8");

4. QTextCodec::setCodecForLocale(codec); //解决汉字乱码问题

5. QApplication a(argc, argv);

6. QDlgLogin *dlgLogin=new QDlgLogin; //创建对话框

7.if (dlgLogin->exec()==QDialog::Accepted)

8. {

9. QWMainWindow w;

10. w.show();

11.return a.exec();

12. }

13.else

14.return 0;

15.}

在主窗口之前创建 Splash 登录对话框对象 dlgLogin,并以模态显示的方式调用此对话框。如果对话框返回的是 QDialog::Accepted,说明通过了用户名和密码验证,就创建主窗口并显示;否则退出应用程序。由于 QDlgLogin 设置为关闭时删除,验证关闭登录窗口后,对象会自动删除。

ui用户界面设计课程设计报告

UI用户界面设计 大作业课程设计报告 题目:依依旅行系统前台应用及后台管理院别:信息与控制学院 专业:计算机科学与技术 学生姓名: 7宋依依 指导教师:孙丽云 成绩: 2015年 6 月 12 日 一、系统概述 1.1课程设计题目: 依依旅行系统前台及后台管理 1.2 课程设计运行环境: Java,MyEclipse6.5,Tomcat5.x Microsoft SQL Server 2008 360安全浏览器7.1 1.3 课程设计实现技术: 基于HTML,CSS,JSP等技术的应用 二、依依旅行系统需求分析 2.1系统功能需求:

系统的功能需求包括一下几个方面 (1)游客在不登录的情况下只可以进行相关旅行,车票,酒店信息的查询。(2)游客通过注册登录或者登录后,可以通过网络查询景点的信息概况和预定景点票,酒店,车票(飞机票,火车票,或者租车)。 (3)游客登录后还可以进行各种订单的退订,个人信息的修改。 (4)系统管理员可以查看游客的预定请求和取消预定的请求。 (5)系统管理员可以对系统的数据库进行维护,例如增加、删除和修改景点信息,增加、删除工作人员帐户,增加和删除旅行用户。 三、依依旅行系统概要分析 3.1旅游系统模块介绍 满足以上需求的管理系统主要包括以下几个模块。 (1)旅游数据维护模块 基本数据维护模块提供了使用者录入、修改并维护基本数据的途径。例如对游客及导游及工作人员各项信息的更新和修改。 (2)旅游业务模块 基本业务模块主要用于实现游客查询景点信息和预定的管理,可以登陆系统预定景点游票和导游预定,工作人员可以处理预定信息和取消预定信息等操作。 (3)数据库管理模块 在系统中,所有景点信息以及工作人员和导游的帐户信息都要进行统一管理,景点的使用情况和预定情况也要进行详细的记录,要用统一的数据库平台进行管理。 (4)旅游信息查询模块 信息查询模块主要用于查询景点的信息和游客的预定信息。 下图所示表示了旅游开发管理系统的功能需求: 3.2旅游数据维护模块 数据维护模块包括如下图所示的几个方面: (1)修改更新景点信息:系统管理员可以更新和修改景点信息。 (2)更新和修改信息:系统管理员可以更新和修改旅游景点和酒店出行,删除游客的信息。 (3)添加景点信息:系统管理员可以添加景点及景点信息。 (4)删除景点信息:系统管理员可以删除景点及景点信息。 3.3旅游业务模块 旅游业务模块包括一下几个方面: (1)注册登陆后,更改个人信息 (2)查询信息:游客查询景点使用信息及景点概括信息。 (3)预定取消景点:游客预定景点票。 (4)酒店预订:游客可一根据情况预定酒店。 (5)出行方式:游客可以根据自己的情况选择出行方式。 3.4数据库管理模块 数据库模块包括一下一个方面: (1)游客信息管理:信息包括游客的姓名,电话号码,及联系方式等。(2)景点信息管理:景点信息包括景点的名称,代号,概况等。

QT习题

QT习题 一、名词解释 1、虚函数: 2、回调函数: 3、内联函数: 4、信号与插槽: 5、私有函数: 6、构造函数: 7、公有函数: 8、内联函数: 9、信号与插槽: 10、析构函数: 二、判断题 1、在QT中Qwidget不可以作为应用程序的窗口()。 2、在创建窗口部件的时候,窗口部件通常不会显示出来()。 3、布局管理器不是一个窗口部件() 4、FindDialog(QWidget *parent = 0);父参数为NULL,说明有父控件。() 5、show()显示的对话框是模式对话框。用exec()显示的对话框是无模式对话框。 () 6、布局管理器派生自QObject。() 7、Q_OBJECT是一个宏定义,如果类里面用到了signal或者slots,就必须要声 明这个宏。() 8、FindDialog(QWidget *parent = 0);父参数为NULL,说明没有父控件。() 9、槽可以是虚函数,可以是公有的,保护的,也可是私有的。() 10、show()显示的对话框是无模式对话框。用exec()显示的对话框是模式对话 框。() 三、简答题 1、简述一下信号与插槽机制。 2、简述布局管理器的功能,列举3个布局管理器。 3、简述使用Qt设计师,在创建对话框时主要包含哪几个基本步骤? 4、GUI程序通常会使用很多图片,请简述3种提供图片的方式。 5、列举几种Qt中会产生绘制事件的情况。 6、Update()与repaint()之间的区别? 7、对窗体上的控件进行布局管理一般有哪几种方式,简述一下其缺点。 8、简述事件和信号的特点和区别。 9、简述主函数中创建QApplication对象功能。 10、简述使用Qt设计师,在创建对话框时总是包含哪几个基本步骤?

用户界面设计说明书样本

用户界面设计说明 书

[键入公司名称] [键入文档标题] [键入文档副标题] [键入作者姓名] 2012/11/27

修订历史记录

目录 1 引言................................................... - 3 - 1.1编写目的............................................ - 3 - 1.2项目背景............................................ - 4 - 1.3定义、缩略词........................................ - 4 - 1.4参考资料............................................ - 5 - 2 应当遵循的界面设计规范 ................................. - 5 - 2.1用户界面设计原则.................................... - 5 - 2.2界面一致性.......................................... - 5 - 2.3布局合理化原则.......................... 错误!未定义书签。 3 界面的关系图和工作流程图 ............................... - 7 - 4 主界面................................................ - 10 - 4.1主界面............................................. - 10 - 4.2子界面A ........................................... - 11 - 4.3子界面B ........................................... - 12 - 4.4子界面C ........................................... - 13 - 4.5子界面D ........................................... - 14 - 4.6子界面E ........................................... - 15 - 4.7子界面F ........................................... - 16 - 5 美学设计.............................................. - 17 -

Qt 编写多窗口程序

编写多窗口程序 导语 程序要实现的功能是:程序开始出现一个对话框,按下按钮后便能进入主窗口,如果直接关闭这个对话框,便不能进入主窗口,整个程序也将退出。当进入主窗口后,我们按下按钮,会弹出一个对话框,无论如何关闭这个对话框,都会回到主窗口。 程序里我们先建立一个工程,设计主界面,然后再建立一个对话框类,将其加入工程中,然后在程序中调用自己新建的对话框类来实现多窗口。 在这一篇还会涉及到代码里中文字符串显示的问题。 目录 一、添加主窗口 二、代码中的中文显示 三、添加登录对话框 四、使用自定义的对话框类 正文 一、添加主窗口 1.我们打开Qt Creator,新建Qt Gui应用,项目名称设置为“nWindows”,在类信息界面保持基类为QMainWindow,类名为MainWindow,这样将会生成一个主窗口界面。 2.完成项目创建后,打开mainwindow.ui文件进入设计模式,向界面上拖入一个Push Button,然后对其双击并修改显示文本为“按钮”,如下图所示。 3.现在运行程序,发现中文可以正常显示。在设计模式可以对界面进行更改,那么使用代码也可以完成相同的功能,下面就添加代码来更改按钮的显示文本。

二、代码中的中文显示 1.我们点击Qt Creator左侧的“编辑”按钮进入编辑模式,然后双击mainwindow.cpp文件对其进行编辑。在构造函数MainWindow()中添加代码: MainWindow::MainWindow(QWidget*parent): QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); ui->pushButton->setText("新窗口");//将界面上按钮的显示文本更改为“新窗口”} 这里的ui对象就是界面文件对应的类的对象,在mainwindow.h文件中对其进行了定义,我们可以通过它来访问设计模式添加到界面上的部件。前面添加的按钮部件Push Button,在其属性面板上可以看到它的objectName属性的默认值为pushButton,这里就是通过这个属性来获取部件对象的。 我们使用了QPushButton类的setText()函数来设置按钮的显示文本,现在运行程序,效果如下图所示。 2.我们发现,在代码中来设置按钮的中文文本出现了乱码。这个可以有两种方法来解决,一个就是在编写程序时使用英文,当程序完成后使用Qt语言家来翻译整个软件中的显示字符串;还有一种方法就是在代码中设置字符串编码,然后使用函数对要在界面上显示的中文字符串进行编码转换。因为翻译一个软件很麻烦,对于这些小程序,我们希望中文可以立即显示出来,所以下面来讲解第二种方法。 3.设置字符串编码,可以使用QTextCodec类的setCodecForTr()函数,一般的使用方法就是在要进行编码转换之前调用该函数,下面我们在main.cpp文件中添加代码:

用户界面设计实验-系统界面设计实例完整版.doc

用户界面设计实例 ● 设计的系统名称:个人日常事务管理系统 ● 针对用户群是:广大电脑用户(有一定的电脑操作基础),officer 和广大学 生。 一、系统需求分析(The system requirement ) 针对officer 和学生们的需求分析,从我自身分析:对于我日常的安排我平 时会用专门的记事本记录和更改,对于日常各种事务可能会冲突或不变携带,现在针对这些需求,设计出符合此人群适合的一款系统来帮助人们更好的安排日程和完成工作。此系统是要面向个人的,同企业系统相比,此软件要力求操作简单,效率要高效,由于针对的人群是officer 和大学生,这些人都是年轻的一代人,对计算机和系统都比较了解,而且倾向于华丽的界面,但是该系统同时要解决高效,较少的操作较快地达到用户的需求。由于工作原因或计算机系统崩溃等用户在本机保存的日程安排等数据可能丢失的情况,同时,有些情况下可能无法连接网络,此系统应支持 1.、本机数据保存。2、可以上传到服务器数据库,用户注册可获得免费的空间,用户注册后,只要登录就能在随时随地获得自己的日程安排等信息。 二、系统功能定义(The function definitions ) 个人日程管理系统主要是提供个人时间日程安排系统软件,它具有相当方便的操作接口,让用户能够对所安排的行程一目了然,除去主要功能还附带了更多功能和小工具,安排的行程可以生成通行路线,并会根据天气预报提醒当天安排是否影响。而且用户可以注册,注册后用户有更多的服务,安排的日程数据可以保存到本地同时可以更新到服务器,这样用户就算到外地也可以随时查看自己的日程安排,同时其他功能有:时钟提醒、通讯录、效率评估等。 实现功能(主界面导航): 个人日常事 务管理系统

Qt Creator 窗体控件自适应窗口大小布局

Qt Creator 窗体控件自适应窗口大小布局 常见的软件窗口大小改变(最大化、手动改变时)需要窗口的部件能够自适应布局,而在Qt的应用程序界面设计中,对于像我一样的初学者如何实现窗口自适应调整还是要绕点弯路的。网上百度了很多,多数说的很含糊,还有很多是用程序实现的,既然已经有Qt Creator那么高集成度的工具了,我还是倾向于直接在Qt Creator中通过可视化配置的方式完成,一是所见即所得,而是效率要高不少。 Qt中如果想实现窗体内空间随着窗体大小调整,必须使用布局管理,常用的布局管理有QHBoxLayout、QVBoxLayout、QGridLayout,空的地方使用spacer 控件进行填充,因此首先将窗体空间使用布局管理典型应用如下图所示。 我这里使用QGridLayout,按住Ctrl多选需要布局的窗体控件,右键-布局-栅格化局,根据需要进行调整。 要想是控件根据窗体进行调整,最为重要的一点就是设置窗口部件的大小策略,各控件均有这一项设置,如下图所示。

这部分具体的参数解释摘录如下: 结合控件的SizePolicy属性,来控制布局管理中的控件的尺寸自适应方式。 控件的sizePolicy说明控件在布局管理中的缩放方式。Qt提供的控件都有一个合理的缺省sizePolicy,但是这个缺省值有时不能适合所有的布局,开发人员经常需要改变窗体上的某些控件的sizePolicy。一个QSizePolicy的所有变量对水平方向和垂直方向都适用。下面列举了一些最长用的值: A. Fixed:控件不能放大或者缩小,控件的大小就是它的sizeHint。 B. Minimum:控件的sizeHint为控件的最小尺寸。控件不能小于这个sizeHint,但是可以 放大。 C. Maximum:控件的sizeHint为控件的最大尺寸,控件不能放大,但是可以缩小到它的最小 的允许尺寸。

基于LABVIEW的用户登录界面设计

基于LABVIEW的用户登录界面设计 Labview具有功能强大的数学工具,用在传感器设计上可大大降低软件的设计负担。对于一个实际的传感器使用,其用户数量有限,其登陆界面设计可以完全借助其数组函数与数据记录文件完成,而不就是数据库,这样既减轻了系统的重量,也减轻了系统的负荷。没有牵涉第三方的软件,系统的稳定性也大大提高。本文设计了一个简单的用户登录系统的2个模块,希望能对读者有所启发。 1)用户初始文件的建立 Labview的数据记录文件具有较强的功能,并且不能用写字本打开,因此作为一般的保密级别可以用来存储初程序运行环境数据,本文用来存储登陆系统的用户数据。 本程序采用两个套嵌while循环,用于批量产生用户名单,内While

采用三个文本输入框,分别输入用户姓名、用户初始密码、用户权限等内容,并用系统时间空间获取用户建立时间,通过数组创建函数创建成一维数组,点击确定键完成一个用户的建立,可以继续进行下一个用户的建立(当然您也可以只建立一个超级用户,在超级用户登陆后继续建立用户名单),用户建立完毕点击停止按钮完成用户名单建立,形成一个二维数组,由于点击停止键时,最后一个用户名单会重复建立,故采用数组删除函数去掉最后一行,然后创建一个文件,用数据记录函数将该名单存储在您希望的文件夹内(本例放在桌面上,面板上的数组就是为验证程序而建立的,可以去掉)。 2)登陆界面 登陆面板实际上只有两个文本输入控件:用户名与密码。程序首先将记录文件读入内存,让后将第一列(索引0列)的所有用户列出来,用一维数组搜索函数搜索该用户密码所在的行号,再用该行号将该用户的信息从记录文件索引出来。由于密码放在第二列(1列),直接从用户的记录信息索引第第二列(索引1列)取出该用户密码),直接用文本比较“等于”函数进行比较用户输入的密码就是否与其预设的密码一致。 至于修改用户名单、用户权限等内容可用“数组的删除、插入”

app用户界面设计大作业演示版.doc

教学站:杭州前进学号:201812925310039 姓名:詹浩裕 医护app用户界面设计说明书 修订历史记录

目录 1 引言................................................... - 2 - 1.1编写目的............................................ - 2 - 1.2项目背景............................................ - 2 - 1.3主要功能 (2) 2 应当遵循的界面设计规范 ................................. - 2 - 2.1用户界面设计原则.................................... - 2 - 2.2界面一致性 (4) 2.3布局合理化原则.......................... 错误!未定义书签。 3 引导页..................................... 错误!未定义书签。 4 主界面................................................. - 5 - 4.1主界面.............................................. - 6 - 4.2登录页面................................ 错误!未定义书签。 4.3各子界面 (7) 5 美学设计 (10) 6 界面资源设计 (10) 6.1图标资源 (10) 7 投诉与建议 (11)

Qt自定义窗口部件

【原创】Qt自定义窗口部件 QtDesigner自定义窗口部件有两种方法:改进法(promotion)和插件法(plugin)改进法 1、改进法之前,要先写好子类化QSpinBox后的HexspinBox.h和HexspinBox.cpp文件。把这两个文件拷贝到想要的项目中。 HexspinBox.h HexspinBox.cpp

2、在需要开发的项目中的窗口中, 1、用Qt Designer创建一个新的窗体main.ui,把控件箱里的QSpinBox添加到窗体中。 2、右击微调框,选择“Promote to ”上下文菜单。 3、在弹出的对话框中,类名处填写“HexSpinBox”,头文件填写“hexspinbox.h” 好了。在ui生成的包含有QSpinBox的控件文件中,ui的源代码里面多了一段 HSpinBox QSpinBox

hspinbox.h
包含文件变为"hexspinbox.h"。在Qt Designer中,QSpinBox表示的控件为HexSpinBox,并且可以设置所有的QSpinBox的属性。

可以在VS2008中编译一下main.ui文件,从ui_main.h源代码中可以知道,引入的控件是: 升级法的缺点是不能在Qt Designer中设置自定义控件自己的特有属性,也不能够绘制自己。这些问题可以用插件法解决。 插件法 1.VS中创建Qt4 Design Plugin 工程,名称叫custom 自动建立如下几个文件: 自定义控件:custom.h,custom.cpp 插件:customplugin.h,customplugin.cpp 源代码如下:

QT界面开发

1Qt4界面开发 1.1Q t历史 Qt是一个用于桌面系统和嵌入式开发的跨平台应用程序框架。它包括一个直观的API 和一个丰富的类库,以及用于GUI开发和国际化的集成工具,另外它支持Java?和C++开发。Qt让企业无须重新编写源代码,便可以构建运行在不同桌面操作系统和嵌入式设备上的软件应用程序。 Qt框架最早可公开获取是在1995年5月。最初是由Haavard Nord(TrollTech公司的首席执行官)和Eirik Chambe-Eng(TrollTech公司的董事会主席)。Haavard和Eirik 最早在特隆赫姆的挪威技术学院相遇,在那里他们双双获得了计算机科学硕士学位。 早在1991年,Haavard 就开始写一些最终成为Qt的类,并和 Eirik合力设计。在接下来的一年,Eirik提出了“信号和槽”的思想,一个现在已经被一些其他套装工具包含简单但功能强大的GUI编程范式。Haavard 接受了这一思想并手工生成了这一思想的代码实现。到1993年,Haavard和Eirik已经完成了Qt的第一个图形内核的开发并能用它来实现一些他们所需的物件。在这一年的年末,Haavard建议他们一起去经商,创建一个“世上最好的C++ GUI框架”。 字母“Q”被选为类的前缀是因为这个字母在Haavard的Emacs字体中看起来很漂亮。受到Xt(the X toolkit)的启发,字母“t”被追加来表示“toolkit”。公司在1994年5月4日成立,起初被命名为“Quasar Technologies”,之后被改名为“Troll Tech”,今天则被称为奇趣科技(Trolltech)。 1995年5月20日,Qt 0.90被上传到https://www.doczj.com/doc/c95104791.html,。六天后,这一发布在comp.os.linux.announce被宣布。这是Qt的第一个公共发行版。Qt可以被用在Windows 和Unix开发中,在两个系统中提供相同的API。Qt从一开始就可以在两种许可协议下获取:一个是商业开发中需要的商业许可协议,一个用于开源开发的自由软件版。 1996年3月,欧洲航天局成为Qt的第一个客户,一下买了十个Qt商业许可。Qt 0.97在同年的5月底发布,1996年9月24日,Qt 1.0发布。到了同年年底,Qt到达了版本1.1;拥有8个客户,每一个都在不同的国家,他们购买了18个商业许可。 Qt 1.2 在1997年4月发布。Matthias Ettrich利用Qt构建KDE的决定帮助Qt成为Linux C++ GUI 开发的实际标准,1997年9月Qt 1.3发布。 1998年9月,Qt 1的最后一个主要发行版1.40发布。Qt 2.0于1999年7月发布。Qt 2有了一个新的开源许可协议,发布许可协议(QPL),遵守开源的定义。1999年8月,Qt赢得了LinuxWorld的“最佳开发库/工具”大奖。 2000年奇趣科技发布了Qtopia核心(后来成为Qt/Embedded)。它被设计用来运行在嵌入式Linux设备上并提供了自己的窗口系统作为X11的一个轻量级代替。现在Qt/X11和Qtopia核心都可以通过GNU通用许可(GPL)获取。到2000年年底,奇趣科技成立了Trolltech Inc.(USA)并且发布了Qtopia的第一个版本,一个移动电话和PDAs应用程序平台。Qtopia赢得了2001和2002年LinuxWorld的“最佳嵌入式 Linux 解决方案”大奖,

用户界面设计及标准答案

1.用户满意度=功能+___人机界面_____+响应时间+可靠性+易安装性+____信息____+可维护性+其他因素 2. ____人机交互(人机对话)____是指人与计算机之间使用某种语言、以一定的交互方式,为了完成任务进行的一系列信息交换过程。 3.软件界面设计分为____功能性设计界面____、____情感性设计界面____、____环境性设计界面____。 4.进行系统分析和设计的第一步是___用户分析_____。 5.使用较早,也是使用最广泛的人机交互方式是____交互方式____。 6.软件界面开发流程包括____系统分析____、____系统设计____、____系统实施____三个阶段 7.设计阶段包括界面的____概念设计____、____详细设计____、____原型建立____与界面实现以及综合测试与评估等8.VB 是以结构化___Basic_____语言为基础、以____事件驱动作____为运行机制的可视化程序设计语言。 9.菜单使用形式主要有____菜单操作____和____Tba控件操作____两种。 10.随着计算机图形技术的发展,以直接操纵、桌面隐喻以及所见即所得为特征的____图形用户界面____技术广泛被计算机系统采用。 11.在用VB 开发应用程序时,一般要布置窗体、设置控件的属性、___编写代码___。 12. 假定在窗体上有一个通用对话框,其名称为CommonDialog1,为建立一个保存文件对话框,则需要把Action 属性设置为__value__。 13. 计时器事件之间的间隔通过__interval__属性设置。 14. 语句“Print “5+65=”;5+65”的输出结果为__5+65=70__。 15. 设有下列循环体,要进行4次循环操作,请填空。 x = 1 Do x = x * 2 Print x Loop Until__x<=32__ 16. 下列程序段的执行结果为__2 3 5__。 x = 1 y = 1 For I = 1 To 3 F= x + y x = y y = F Print F; Next I 17. 以下为3个列表框联动的程序,试补充完整。 Private Sub Dir1_Change() File1.Path=Dir1.Path End Sub Private Sub Drive1_Change() Drivel.Path=File1.Path;Dir1.Path=Drivel.Path__[7]__ End Sub 18. 在下列事件过程中则响应该过程的对象名是cmdl,事件过程名是__窗口标题事件__。 Private Sub cmd1_Click() Form1.Caption=“VisualBasic Example” End Sub 19. 当将文本框的SelStar 属性设置为0时,表示选择第开始位置在第一个字符之前,设置为1时表示__[9]__。 20. 以下程序代码实现单击命令按钮Command1 时形成并输出一个主对角线上元素值为“-”,其他元素值为“+”第6*6 阶方阵。 Privas Sub Command1_Click() DimA(6,6) For I = 1 To 6 For J = 1 To 6 If I = J Then Print “-” Else __[10]__ End If Print A (I,J); Next J Print Next I

qt自定义窗口的标题栏

因为标题栏属于窗口管理器控制,也就受限于操作系统,所以直接利用Qt来修改是不可行的! 通常情况下利用Qt我们 可以自定义标题栏,这里提供一个简单的例子! 例子比较简,大致思路是正常创建窗口后,屏蔽标题栏,通过布局将一个QLabel和三个按钮构成一个“标题栏” 放置在顶端(视个人喜好,位置可以任意放置),重新实现必要的事件。 下面分步骤进行:

1. 创建窗口,屏蔽标题栏 例子中是创建了一个MainWindow窗口,构造过程中传入Qt::FramelessWindowHint 参数. customTitleBar::customTitleBar(QWidget *parent, Qt::WFlags flags) : QMainWindow(parent, Qt::FramelessWindowHint) { ui.setupUi(this); ui.menuBar->hide(); ui.statusBar->hide(); ...... } 2. 将自定义的“标题栏”放入窗口中 这里我们直接用QDeisgner进行设计,设计完成后利用布局将其置于顶端即可.

3. 事件处理在这里我们只是简单实现鼠标操作窗口的放大、缩小和移动, 所以只重写鼠标事件: 单击、释放、双击和移动。 view plaincopy to clipboardprint? 1./* 2. QRect rect = ui.titleFrame->frameRect(); 3. if(rect.contains(event->pos())); 4.这两句就是用于判断鼠标位置是否落在“标题栏”内。 5.*/ 6.void Qt_Test::mousePressEvent(QMouseEvent *event) 7.{ 8. if(event->button() == Qt::LeftButton) 9. { 10. dragPosition = event->globalPos() - frameGeometry().topLeft(); 11.

登录界面设计

目录 第一章绪论 (1) 第二章功能需求分析 (2) 第一节社会与技术背景 (2) 第二节客户功能需求分析 (2) 第三节系统运行的软、硬件环境 (2) 第四节系统的具体功能要求 (2) 第三章系统设计 (3) 第一节采用的软件及开发平台 (3) 第二节目的详细设计 (3) 第三节项目的总体框架 (4) 3.3.1 流程图 (4) 3.3.2 登录界面 (5) 第四章技术实现 (6) 4.1 主要功能模块的具体实现 (6) 4.1.1判断文件是否存在: (6) 4.1.2标准模块sub过程jiami: (8) 4.1.3列表框中可记住登录成功的用户名: (8) 4.1.4登录功能代码: (9) 4.1.5 退出程序代码: (11) 4.1.6选择已成功登录的用户名: (11) 4.1.7修改密码代码: (12) 4.1.8返回登录窗体代码: (13) 4.2主要难题的解决方法 (13) 4.3 亮点或创新点 (13) 第五章总结与体会 (14) 第六章参考文献 (15)

第一章绪论 计算机和网络技术的出现和发展改变了世界,也改变了人们的生活.作为新世纪的大学生,我们应当站在时代发展的前列,掌握计算机语言,调整知识结构和能力结构,充满活力和创新意识才能适应社会发展的要求. 作为计算机高级语言之一,visual basic 是Microsoft公司推出的可视化开发工具,由于其功能强大,内容十分丰富,随着版本的不断升级,已经成为应用程序开发人员的首选工具之一。 在当今科技社会,随着网络,信息技术的飞速发展,登录界面设计的设计已经变成一个网站登录的重要研究课题,本次课题设计有助于对登录界面设计的探索和改进,以便于以后能设计出更好的登录界面,推进网络技术和网站的建设。 本次课题重点解决了判断用户输入的帐号和密码是否正确及用户修改密码问题本程序设计简单,功能基本齐全,使用简捷便利,对硬件要求不高,可在windows环境下运行,能实现登录及修改密码的功能。. 由于笔者水平所限,本论文在书写过程中又难免还存在不妥之处,敬请读者予以批评指正。 牛涛 2008.07.21

Qt 编写多窗口程序

编写多窗口程序 版权声明 该文章原创于Qt爱好者社区(https://www.doczj.com/doc/c95104791.html,),作者yafeilinux,转载请注明出处! 导语 程序要实现的功能是:程序开始出现一个对话框,按下按钮后便能进入主窗口,如果直接关闭这个对话框,便不能进入主窗口,整个程序也将退出。当进入主窗口后,我们按下按钮,会弹出一个对话框,无论如何关闭这个对话框,都会回到主窗口。 程序里我们先建立一个工程,设计主界面,然后再建立一个对话框类,将其加入工程中,然后在程序中调用自己新建的对话框类来实现多窗口。 在这一篇还会涉及到代码里中文字符串显示的问题。 目录 一、添加主窗口 二、代码中的中文显示 三、添加登录对话框 四、使用自定义的对话框类 正文 一、添加主窗口 1.我们打开Qt Creator,新建Qt Gui应用,项目名称设置为“nWindows”,在类信息界面保持基类为QMainWindow,类名为MainWindow,这样将会生成一个主窗口界面。 2.完成项目创建后,打开mainwindow.ui文件进入设计模式,向界面上拖入一个Push Button,然后对其双击并修改显示文本为“按钮”,如下图所示。

3.现在运行程序,发现中文可以正常显示。在设计模式可以对界面进行更改,那么使用代码也可以完成相同的功能,下面就添加代码来更改按钮的显示文本。 二、代码中的中文显示 1.我们点击Qt Creator左侧的“编辑”按钮进入编辑模式,然后双击mainwindow.cpp文件对其进行编辑。在构造函数MainWindow()中添加代码: MainWindow::MainWindow(QWidget*parent): QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); ui->pushButton->setText("新窗口");//将界面上按钮的显示文本更改为“新窗口”} 这里的ui对象就是界面文件对应的类的对象,在mainwindow.h文件中对其进行了定义,我们可以通过它来访问设计模式添加到界面上的部件。前面添加的按钮部件Push Button,在其属性面板上可以看到它的objectName属性的默认值为pushButton,这里就是通过这个属性来获取部件对象的。 我们使用了QPushButton类的setText()函数来设置按钮的显示文本,现在运行程序,效果如下图所示。

用户登录与注册的设计

课程实验报告 专业计算机信息管理 班级09秋计算机 姓名李亚娜 实验报告填写说明

1、填写一律用钢笔或圆珠笔填写或打印,要求字迹工整,条理清晰。2、“实验题目”可以填写章节名称或用文字表述。 3、“实验目的”要逐条列出,“实验内容”以简练的文字进行概括。4、“附注”处填写实验注意事项或调试过程,以及实验中出现的异 常情况和解决方法。 5、“教师批阅”处由课任老师填写评语,给出实验成绩,并作为平 时成绩,参与期末成绩总评。 2011年11月25日 实验项目:用户登录与注册的设计

实验目的: 1.能正确设计用户注册程序。 2.能正确设计用户登录程序。 3.能正确设计用户的管理程序。 实验仪器: 电脑一台(CPU:T4400 ,内存:2G ,操作系统:WindowsXP) Macromedia Dreamweaver 8软件 实验步骤(或程序清单:) (一)编程实现用户注册功能 首先创建注册界面 图1注册界面 任务1操作方法: 1)用dreamweaver打开前面我们所创建的动态网站,将项目三中所设计的静态注册页面 reguser.html复制一份并改名为reguser.asp,其中注册部分页面如图2如所。

图2注册界面 3)选择标签

,将其属性按图3修改,将表单名称命名为fom1,动作右侧的文本框中 输入reguser.asp?act=reg,其含义为此表单提交到本页处理,并附加参数act=reg,此参数含义为表单填写完成后提交表单进行注册的参数传递,方法右侧的列表中选择post,其它方面可以忽略。 图3表单属性 4)依照表1修改各个表单元素的名称,以方便程序的编写。 表1注册表单中各表单元素的名称 文本名称表单元素名称文本名称表单元素名称 用户名f_user固定电话f_tel1f_tel2 密码f_code手机号码f_mtel 姓名f_name其他联系f_contact 性别f_sex提交submit 详细地址f_addr 重置reset 设计思想: 当用户输入注册信息时,如果用户名或密码没有填写时系统出现提示信息“用户名或密码不能为空!”,并将重新注册; 如果用户名在数据库中已经存在通过判断语句系统会有弹出提示信息“用户名已经存 在,请重新注册!”,本教材的其他信息并不要求必须输入,读者可以自己设计; 将用户信息写入到数据库的tbl_user表中保存,注册成功时会有弹出信息“注册成功!”,单击“确定”按钮将跳转到登录页面可供用户登录,如果注册失败弹出提示信息,并说明注 册失败的原因。 任务2操作方法: 1)先创建一个数据库连接文件db.asp,代码: <% dim conn,dbpath set conn=Server.CreateObject("adodb.connection") DBPath = Server.MapPath("db/tygasp.mdb") conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="& DBPath %> 2)打开网页的代码视图,我们在网页的最上部添加代码如下的代码如图4所示,由于数据库连接文件我们在项目五中已经完成,本项目只要使用语句将其引用到本页面中即可,以后的网页中也是一样:

Qt界面如何布局

关于Qt界面中对于相关控件进行布局管理 在用Qt进行用户界面应用程序的编程时,建议通过编写相关代码来生成和维护Qt控件,而不要用Qt Designer。这时对相应的Qt控件进行布局管理显得尤为重要。 常见的三种布局方式: 网格布局:QGridLayout 水平布局:QHBoxLayout 垂直布局:QVBoxLayout 步骤: 1)以单个的Qt控件为单位,先进行子块布局,分别对各个子块进行布局。 2)以步骤1)中的子块为单位,进行全局布局。 例如:我们要完成如下样式的Qt界面,整个Qt界面有ABCDEFXYZ共计9个Qt控件。 方法1: 1)用“网格布局”对ABCDEF(子块1)进行布局 QGridLayout *leftLay=new QGridLayout; 用“垂直布局”对XYZ(子块2)进行布局 QVBoxLayout *rightLay=new QVBoxLayout; 2)用“水平布局”对子块1(ABCDEF)、子块2(XYZ)进行全局布局 QHBoxLayout *mainLay=new QHBoxLayout; mainLay->addLayout(leftLay); mainLay->addLayout(rightLay); 方法2: 1)用“水平布局”对AB(子块1)进行布局 用“水平布局”对CD(子块2)进行布局 2)用“垂直布局”对子块1(AB)、子块2(CD)、E、F进行布局,形成子块3(ABCDEF)。3)用“垂直布局”对XYZ(子块4)进行布局 4)用“水平布局”对子块3(ABCDEF)、子块4(XYZ)进行全部布局

方法1: QGridLayout *leftLay=new QGridLayout; leftLay->addWidget(hostLabel,0,0); leftLay->addWidget(hostLineEdit,0,1); leftLay->addWidget(portLabel,1,0); leftLay->addWidget(portLineEdit,1,1); leftLay->addWidget(myCheckBox,2,0,1,2); leftLay->addWidget(myListWidget,3,0,1,2); leftLay->addWidget(msgLabel,4,0,1,2); QVBoxLayout *rightLay=new QVBoxLayout; rightLay->addWidget(logButton); rightLay->addWidget(sendButton); rightLay->addWidget(linkButton); QHBoxLayout *mainLay=new QHBoxLayout; mainLay->addLayout(leftLay); mainLay->addLayout(rightLay); setLayout(mainLay);

Qt基础教程之自定义对话框及调用方法

在一个应用程序设计中,为了实现一些特定的功能,必领设计自定义对话框。 自定义对话框的设计一般从 QDialog 继承,并且可以采用UI设计器可视化地设计对话框。对话框的调用一般包括创建对话框、传递数据给对话框、显示对话框获取输入、判断对话框单击按钮的返回类型、获取对话框输入数据等过程。 本节将通过实例 samp6_2 来详细介绍这些原理。图 1 是实例 samp6_2 的主窗口,及其设置表格行列数的对话框。 图 1 实例 samp6_2 主窗口及其设置表格行列数的对话框 主窗口采用 QTableView 和 QStandardltemModel、QltemSelectionModel 构成一个通用的数据表格编辑器,设计了 3 个对话框,分别具有不同的功能,并且展示对话框不同调用方式的特点: ?设置表格行列数对话框 QWDialogSize 该对话框每次动态创建,以模态方式显示(必须关闭此对话框才可以返回主窗口操作),对话框关闭后获取返回值,用于设置主窗口的表格行数和列数,并且删除对话框对象,释放内存。 这种对话框创建和调用方式适用于比较简单,不需要从主窗口传递大量数据做初始化的对话框,调用后删除对话框对象可以节约内存。

?设置表头标题对话框 QWDialogHeaders 图 2 是设置表格表头标题的对话框,该对话框在父窗口(本例中就是主窗口)存续期间只创建一次,创建时传递表格表头字符串列表给对话框,在对话框里编辑表头标题后,主窗口获取编辑之后的表头标题。 图 2 设置表格表头标题对话框 注意,对话框以模态方式显示,关闭后只是隐藏,并不删除对象,下次再调用时只是打开己创建的对话框对象。 这种创建和调用方式适用于比较复杂的对话框,需要从父窗口传递大量数据做对话框初始化。下次调用时不需要重复初始化,能提高对话框调用速度,但是会一直占用内存,直到父窗口删除时,对话框才从内存中删除。 ?单元格定位与文字设置对话框QWDialogLocate 图 3 是单元格定位和文字设置对话框,该对话框以非模态方式调用,显示对话框时还可以对主窗口进行操作,对话框只是浮动在窗口上方。在对话框里可以定位主窗口表格的某个单元格并设置其文字内容,在主窗口上的表格中单击鼠标时,单元格的行号、列号也会更新在对话框中。对话框关闭后将自动删除,释放内存。

如何在Qt中使用自定义数据类型 - zhezhelin - 博客园

如何在Qt中使用自定义数据类型 - zhezhelin - 博 客园 如何在Qt中使用自定义数据类型 Q_DECLARE_METATYPE,Qt自定义类型 这里我们使用下面这个struct来做说明(这里不管是struct还是class都一样): 复制代码 QVariant 为了能在QVariant中使用自定义数据类型做,需要使用 Q_DECLARE_METATYPE()来向Qt的元系统声明这个自定义类型。如下列所示: 复制代码 在作为QVariant传递自定义数据类型时,需要使用QVariant::fromValue()或者qVariantFromValue: 复制代码 为了更方便一点,你可以在自定义类型中定义一个QVariant() 类型转换符: 复制代码 这样我们便可以像下面这样使用了: 复制代码 信号和槽 对于直接连接类型(默认情况下就是直接连接)而言,使用自定义数据类型做信号参数不需要做其他其他处理,就像内置数据类型一样: 复制代码 但在跨线程时如果你还这么做,编译器就会给出警告了: 复制代码 这时我们需要先注册Player: qRegisterMetaType<Player>("Player");

qRegisterMetaType<Player>( ); (上面那个是错误的,除非名字刚好和类名一样) connect(sender, SIGNAL(playerCreated(const Player&)), receiver, SLOT(addPlayer(const Player&))); 复制代码 QDebug 最好是能这样: 复制代码 而不是这样: 复制代码 怎么做呢?我们需要对QDebug<<操作符重载一下: 复制代码 QDataStream 跟上面的QDebug很像,我们也需要重载一下<<操作符: 复制代码 QSettings 为了能在QSettings中使用自定义数据类型,需要让Qt的元系统知道有此类型,就像上面介绍QVariant部分一样,另外还要提供相应的QDataStream操作符,还必须注册这个流操作符: 复制代码 如此处理之后我们就可以像下面这样使用了: 复制代码 复制代码 参考: QString QSettingsPrivate::variantToString(const QVariant &v) { QString result;

相关主题
文本预览
相关文档 最新文档