topic8:Qt入门之常用控件认知之QDialog

对话框,顾名思义就是用于“对话”的交互窗口。其主要是体现人机交互的一个重要的方式和渠道。交互要达到实时性,其优先级也相对较高,所以一般对话框都是没有父窗口的顶级的窗口。如果对话框是父窗口的,对话框也一般显示在父窗口的中心位置。

QDialog是Qt的所有对话框的基类。其主要实现与用户的实时信息或作操作的交互。根据对话框与其他是否处理顺序及输入时间的处理方式,对话框设置为模态或者非模态的。即是否会阻止本程序其他可见窗口的输入。其模式方式可以是应用级模式application,或者窗口window模态方式。如果是系统模态的话,在对话框完成之前,其他窗口时不能操作。通常用户必须完成交互后,关闭对话框,才能访问其他的窗口。如果是window模态的话,其只能阻止和其相关联的的窗口,允许其访问其他在应用程序,和此窗口没有相互关联的窗口。通常显示一个模态,调用exec(),如果exec退出,则会返回一个返回值。其表示窗口时接受accepted或者拒绝rejected。返回值可以使用result调用其值。

通常为了关闭窗口并返回对应的值,则连接一个button到accept()槽函数,或者reject()槽函数。或者使用done()槽函数,传Accepted及Rejected值。一般需要调用setModal(true)或者setWindowModality设置模态,然后使用show。使用show的时候,会将控制权交给用户。setModal对进度条对话框非常有用。这时候需要使用QApplication::progressEvents移交控制权。

1.1 QDialog的模态对话框返回值定义

QDialog::Accepted 1 表示此对话框是被接受的

QDialog::Rejected 0 表示此对话框被拒绝。

1.2 QDialog的重要属性

1)modal :bool 模态,此属性表示show()函数会将一个对话框一模态modal或者非模态modeless方式显示。一般,此值为false,并且show执行后显示的是 modeless非模态。通过isModal返回是否为模态,setModel设置其值。如果设置为true,其等效于QWidget::windowModality为Qt::ApplicationModel.

2)sizeGridEnabled:bool设置尺寸手柄是否激活。通常放置到右下端角,当被激活的时候显示,用于控制控件显示的尺寸。isSizeGripEnabled获取状态,setSizeGridEnabled进行设置此值。

1.3 重要的信号

1) accepted() 这个信号时用户被接受或者用户调用accept或者down(QDialog::Accepted)发射。但是如果隐藏窗口使用hide()方法或者setVisible(false)时。

2) finished(int result)如果对话框的result变量被设置,使用setResult设置或者用户调用done,accept,或者reject()槽后发射此信号。dialog在隐藏或者setVisible(false)后则不能发射。

3) rejected()如果窗口被拒了或者用户调用reject()或者done(QDialog::Reject)值。如果widget影藏或者delete掉之后也不发射此信号

1.4 总要的槽函数

1)accept()隐藏模态对话框并将结果设置为Accepted。

2)done(int r) 关闭对话框,并将设置的结果为r。如果说dialog显示使用exec,done()导致本地事件循环 关闭。

3)exec():使用modal模态显示一个对话框。阻止事件直到对话框也结束。

4)open()显示对话框使用windos modaldialog,即,并且立马返回。

5)reject()隐藏模态modal对话框并将resutl值设置为rejected。

1.5)  其他重要的函数

1)result() :int 返回模态对话框的结果,及Accepted或者Rejected。如U哦Qt::WA_DeleteOnClose属性,因为其会删除对象,如果调用则会出现内存非法访问的问题。

2)setResult(int)设置模态对话框的result值为Accepted或者Rejected.。此操作一般会导致finished信号被发射。

3)setVisible(true)显示或者隐藏对话框。

测试程序如下:

class ConnForm : public QDialog

{

Q_OBJECT

public:

ConnForm(QWidget *parent = 0);

~ConnForm(void);

private:

QLabel *hostAddressLabel;

QLineEdit *hostAddressEdit;

QLabel *hostPortLabel;

QLineEdit *hostPortEdit;

QPushButton *connButton;

QPushButton*cancelButton;

QLabel *statusLabel;

QFormLayout *mainFormLayout;

TcpManager *tcpManager;

//QTcpSocket *tcpSocket;

private slots:

void handleStateChange(QAbstractSocket::SocketState);

void handleError(QAbstractSocket::SocketError socketError);

void handleHostFound(void);

void handleConnected();

void connectHost(void);

signals:

void connected(void);

};

ConnForm::ConnForm(QWidget *parent)

:QDialog(parent)

{

setWindowFlags(Qt::FramelessWindowHint);

hostAddressLabel = new QLabel;

hostAddressLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter);

hostAddressLabel->setWordWrap(false);

hostAddressLabel->setText(QObject::tr("Host &Address:"));

hostAddressEdit = new QLineEdit();

hostAddressEdit->setEchoMode(QLineEdit::Normal);

hostAddressEdit->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);

hostAddressEdit->setDragEnabled(false);

hostAddressEdit->setFrame(true);

hostAddressEdit->setInputMask("000.000.000.000; ");

hostAddressEdit->setText("0.0.0.0");

hostAddressLabel->setBuddy(hostAddressEdit);

hostPortLabel = new QLabel();

hostPortLabel->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);

hostPortLabel->setWordWrap(false);

hostPortLabel->setText(QObject::tr("Host &Port:"));

hostPortEdit = new QLineEdit;

hostPortEdit->setEchoMode(QLineEdit::Normal);

hostPortEdit->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);

hostPortEdit->setDragEnabled(false);

hostPortEdit->setInputMask("00000; ");

hostPortEdit->setFrame(true);

hostPortEdit->setText("9999");

hostPortLabel->setBuddy(hostPortEdit);

connButton = new QPushButton;

connButton->setAutoRepeat(false);

connButton->setAutoDefault(true);

connButton->setFlat(false);

connButton->setText(QObject::tr("Connect"));

connect(connButton,SIGNAL(pressed()),this,SLOT(connectHost()));

cancelButton = new QPushButton;

cancelButton->setFlat(false);

cancelButton->setDefault(true);

cancelButton->setAutoRepeat(false);

cancelButton->setText(QObject::tr("Cancel"));

connect(cancelButton,SIGNAL(pressed()),this,SLOT(reject()));

statusLabel = new QLabel;

statusLabel->setAlignment(Qt::AlignCenter);

statusLabel->setWordWrap(true);

statusLabel->setText("");

mainFormLayout = new QFormLayout;

mainFormLayout->setFormAlignment(Qt::AlignCenter);

mainFormLayout->setLabelAlignment(Qt::AlignRight | Qt::AlignVCenter);

mainFormLayout->setSizeConstraint(QLayout::SetFixedSize);

mainFormLayout->setHorizontalSpacing(20);

mainFormLayout->setVerticalSpacing(10);

mainFormLayout->setContentsMargins(10,30,10,20);

mainFormLayout->setRowWrapPolicy(QFormLayout::DontWrapRows);

mainFormLayout->setFieldGrowthPolicy(QFormLayout::FieldsStayAtSizeHint);

mainFormLayout->addRow(hostAddressLabel,hostAddressEdit);

mainFormLayout->addRow(hostPortLabel,hostPortEdit);

mainFormLayout->addRow(connButton,cancelButton);

mainFormLayout->addRow(statusLabel);

setLayout(mainFormLayout);

//tcpSocket = new QTcpSocket(this);

tcpManager = TcpManager::getInstance(NULL);

if(tcpManager->getTcpSocket())

{

connect(tcpManager->getTcpSocket(),SIGNAL(hostFound()),this,SLOT(handleHostFound()));

connect(tcpManager->getTcpSocket(),SIGNAL(stateChanged(QAbstractSocket::SocketState)),this,SLOT(handleStateChange(QAbstractSocket::SocketState)));

connect(tcpManager->getTcpSocket(),SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(handleError(QAbstractSocket::SocketError)));

connect(tcpManager->getTcpSocket(),SIGNAL(connected()),this,SLOT(handleConnected()));

}

//5GeDJ6wM

}

ConnForm::~ConnForm(void)

{

}

void ConnForm::handleStateChange(QAbstractSocket::SocketState stat)

{

QAbstractSocket::SocketState state = tcpManager->getTcpSocket()->state();

QString infoStr = "";

if(state == stat)

{

infoStr.append(" equal ");

}

else

{

infoStr.append(" no equal ");

}

switch(stat)

{

case QAbstractSocket::UnconnectedState: //0

infoStr.append(" UnconnectedState ");

break;

case QAbstractSocket::HostLookupState: //1

infoStr.append(" HostLookupState ");

break;

case QAbstractSocket::ConnectingState: //2

infoStr.append(" ConnectingState ");

break;

case QAbstractSocket::ConnectedState://3

infoStr.append(" ConnectedState ");

break;

case QAbstractSocket::BoundState://4

infoStr.append(" BoundState ");

break;

case QAbstractSocket::ClosingState: //6

infoStr.append(" C losingState ");

break;

case QAbstractSocket::ListeningState://5

infoStr.append(" ListingState ");

break;

}

statusLabel->setText(statusLabel->text()+infoStr);

}

void ConnForm::handleError(QAbstractSocket::SocketError socketError)

{

QAbstractSocket::SocketError se=tcpManager->getTcpSocket()->error();

static QString errInfo = "";

if(se == socketError)

{

errInfo.append("err equal");

}

else

{

errInfo.append("err no equal");

}

//statusLabel->setText(errInfo);

}

void ConnForm::handleHostFound(void)

{

}

void ConnForm::handleConnected()

{

statusLabel->setText("Onnected success");

accept();

}

void ConnForm::connectHost(void)

{

statusLabel->setText(hostAddressEdit->text()+hostPortEdit->text());

tcpManager->connectToHost(hostAddressEdit->text(),hostPortEdit->text().toInt());

}

执行效果如:

上述例子只是一个网络连接的交互接口,如果连接服务器成功,则进入到首页,按取消则退出

总结:

QDialog作为一种交互方式,其模态方式确定交互必须完成后才能操作其他功能。通过信号accept done 及reject表示执行结果并隐藏窗口。在模态下返回对应的结果。可以通过捕捉对应的accepted及rejected,finished信号确定对话框的推出方式。

时间: 2024-10-15 14:17:51

topic8:Qt入门之常用控件认知之QDialog的相关文章

Qt系列03 常用控件

新建一个Qt Widget项目 我们可以看到项目下有四类文件: *.pro 项目配置文件 *.h C++头文件 *.cpp C++源文件 *.ui 界面设计文件 双击*.ui文件,QtCreator会自动进入界面设计模式 最左侧是QtCreator常用的一些功能,比如编辑,设计,Debug,项目,帮助等等. 左侧倒数第二竖列是各种控件,比如Layouts等等. 我们可以直接将各种控件拖入到中间的空白界面中. 下面,我们简单介绍这些控件 按钮组Buttons Buttons下面有6类按钮控件: P

Qt常用控件+事件+基础绘图(四)

第一个Qt程序新建一个空的项目.pro文件内容示例代码:  1 /* 应用程序抽象类 */ 2 #include <QApplication> 3 #include <QWidget> 4 #include <QPushButton> 5 #include <QDebug> 6  7 int main(int argc, char *argv[]) 8 { 9     QApplication app(argc, argv);10 11     QWidge

(转载)VS2010/MFC编程入门之二十二(常用控件:按钮控件Button、Radio Button和Check Box)

因为私人问题,鸡啄米暂停更新了几天,首先向关注鸡啄米动态的朋友说一声抱歉. 言归正传,鸡啄米上一节中讲了编辑框的用法,本节继续讲解常用控件--按钮控件的使用. 按钮控件简介 按钮控件包括命令按钮(Button).单选按钮(Radio Button)和复选框(Check Box)等.命令按钮就是我们前面多次提到的狭义的按钮控件,用来响应用户的鼠标单击操作,进行相应的处理,它可以显示文本也可以嵌入位图.单选按钮使用时,一般是多个组成一组,组中每个单选按钮的选中状态具有互斥关系,即同组的单选按钮只能有

【转】VS2010/MFC编程入门之二十(常用控件:静态文本框)

本文转自鸡啄米:http://www.jizhuomi.com/software/177.html 感 谢鸡啄米对本文的贡献. 上一节鸡啄米讲了颜色对话框之后,关于对话框的使用和各种通用对话框的介绍就到此为止了.从本节开始鸡啄米将讲解各种常用控件的用法.常用控件主要包括:静态文本框.编辑框.单选按钮.复选框.分组框.列表框.组合框.图片控件.列表控件.树形控件和进度条控件等等.本节教程先来讲解静态文本框的使用. 控件的通知消息 在将静态文本框的使用之前,先大概讲讲控件的通知消息. 当控件有事件发

iOS学习-其他常用控件

1 // 2 // ViewController.m 3 // 其他常用控件 4 // 5 // Created by 大欢 on 16/1/25. 6 // Copyright © 2016年 bjsxt. All rights reserved. 7 // 8 9 #import "ViewController.h" 10 11 @interface ViewController () 12 13 @property (weak, nonatomic) IBOutlet UILab

iOS常用控件尺寸大集合

元素控件 尺寸(pts) Window(含状态栏) 320 x 480 Status Bar的高度 20 Navigation Bar的高度 44 含Prompt的Navigation Bar的高度 74 Navigation Bar的图标 20×20(透明的png) Tool Bar的高度 44 Tool Bar的图标 20×20(透明的png) Tab Bar的高度 49 Tab Bar的图标 30×30(透明的png) 竖直时键盘的高度 216.252(iOS 5+的中文键盘) 水平时键盘

B/S一些小知识及常用控件

一: B/S网页的运行 页面在设计的时候,本身就是一个类.在运行的时间,是一个对象. 其中aspx和aspx.cs是在同一个类下. aspx是主要是负责界面,而aspx.cs主要是负责数据逻辑. 呈现:把页面上所有的控件对象,转化成HTML标签.  内存中的对象--->HTML ** 规范 **: 以后写代码的时候,在Page_Load方法中,99%的代码需要写在 if (!IsPostBack) { } IsPostBack——页面初始加载-false;表单提交加载-true 页面初始加载的情

Android常用控件:进度条

各种进度条属于 ProgressBar的子类 Sytle: 水平风格:Horizontal小风格:Small大风格:Large反向风格:Inverse小反向风格:Small.Inverse大反向风格:Large.Inverse 设置style:   style="?android:attr/progressBarStyle..." 主要属性:最大值:max当前进度:progress次要进度值:SecondaryProgress --效果类似于看电影那些缓冲 判断进度条是转圈还是水平的方

android快速上手(三)常用控件使用

完成了android的第一个程序HelloWorld,下面就开始控件的学习,下面是一些常见的控件. (一)TextView 简单的文本描述 (二)EditText 编辑框,输入文字信息 (三)Button 按钮,点击后会触发点击事件,可以对事件进行处理 (四)ImageView 图片控件,可以加载图片显示 (五)ListView 列表,需要跟适配器Adapter结合,适配器提供数据 (六)Toast 闪现提示语,常用于普通的提示文本,只显示一小段时间自动消失 (七)ScrollView 一般用于