QT开发(二十)——QT对话框

QT开发(二十)——QT对话框

一、对话框简介

对话框是与用户进行简短交互的顶层窗口

QDialog是QT中所有对话框窗口的基类,QDialog继承于QWidget,是一种容器型的组件,是定制了窗口样式的特殊QWidget。

QDialog作为一种专用的交互窗口,不能作为子部件嵌入其他容器中。

二、对话框类型

对话框类型分为模态对话框和非模态对话框。

1、模态对话框

模态对话框显示后无法与父窗口进行交互,是一种阻塞式的对话框,使用QDialog::exec()函数调用。

模态对话框一般在栈上创建。

QDialog dialog(this);

dialog.exec();

模态对话框适用于必须依赖用户选择的场合,比如消息显示,文件选择,打印设置等。

2、非模态对话框

非模态对话框显示后独立存在,可以同时与父窗口进行交互,是一种非阻塞式对话框,使用QDialog::show()函数调用。

非模态对话框一般在堆上创建,需要指定Qt:WA_DeleteOnClose属性,避免内存泄漏。

非模态对话框适用于特殊功能设置的场合,比如查找操作,属性设置等。

QDialog* dialog = new QDialog(this);

dialog->setAttribute(Qt::WA_DeleteOnClose);

dialog->show();

3、混合属性对话框

混合属性对话框同时具有模态对话框和非模态对话框的属性,对话框的生成和销毁具有非模态对话框属性,功能上具有模态对话框的属性。

使用QDialog::setModal()函数可以创建混合特性的对话框。通常,创建对话框都需要指定对话框的父组件。

QDialog* dialog = new QDialog(this);

dialog->setAttribute(Qt::WA_DeleteOnClose);

dialog->setModal(true);

dialog->show();

三、对话框的返回值

只有模态对话框采用返回值,模态对话框的返回值用于表示交互结果。

QDialog::exec()函数的返回值作为交互结果。

void QDialog::done(int i)函数关闭对话框,并将参数作为交互结果。

QDialog::Accepted表示用户操作成功

QDialog::Rejected表示用户操作失败

四、标准对话框

1、标准对话框的类型

QT为开发者提供了多种可复用的对话框类型,即QT标准对话框。QT标准对话框全部继承于QDialog类。常用标准对话框类型如下:

对话框对象的定义

QDialogType dialog(this);

对话框属性设置

dialog.setPropertyxxxx(value);

if(dialog.exec() == QDialogType::vaule)

{

Type v = dialog.getDialogValue();

}

2、消息对话框QMessageBox

消息对话框是应用程序中最常用的界面元素。消息对话框主要用于为用户提示重要信息,强制用户进行选择操作。

消息对话框的使用方式如下:

A、创建消息对话框对象

QMessageBox msg(this);

B、设置消息对话框属性

msg.setWindowTitle(“Warning Message”);

msg.setText(“Error Massage!”);

msg.setIcon(QMessageBox::Information);

msg.setStandardButtons(QMessageBox::Ok | QMessage::Cancel);

if(dialog.exec() == QMessageBox::Ok)

{

//

}

C、QMessageBox实用函数

QMessageBox定义了静态成员函数,可以直接调用创建不同风格的消息对话框。

StandardButton information(QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButtondefaultButton = NoButton)

StandardButton question(QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButtondefaultButton = NoButton)

StandardButton warning(QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButtondefaultButton = NoButton)

StandardButton critical(QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButton defaultButton= NoButton)

void about(QWidget * parent, const QString & title, const QString & text)

3、文件对话框QFileDialog

文件对话框用于应用程序中需要打开一个外部文件或需要将当前内容存储到指定的外部文件。

文件对话框的使用方式如下

A、创建文件对话框对象

QFileDialog fdialog(this);

B、文件对话框属性设置

打开文件设置如下:

fdialog.setAcceptMode(QFileDialog::AcceptOpen);

//选择打开多个文件QFileDialog::ExistingFiles

fdialog.setFileMode(QFileDialog::ExistingFile);

if(fdialog.exec() == QFileDialog::Accepted)

{

QStringList s = fdialog.selectedFiles();

for(int i = 0; i < s.count(); i++)

{

qDebug() << s[i];

}

}

保存文件设置如下:

fdialog.setAcceptMode(QFileDialog::AcceptSave);

if(fdialog.exec() == QFileDialog::Accepted)

{

QStringList s = fdialog.selectedFiles();

for(int i = 0; i < s.count(); i++)

{

qDebug() << s[i];

}

}

C、文件类型过滤器

在文件对话框中可以通过文件后缀定义文件过滤器。文件过滤器定义规则如下:

显示名(*.后缀名1 *.后缀名2 ...*.后缀名n)

Image(*.jpg *.png)

Text(*.txt)

All(*.*)

fdialog.setFilter("Image(*.png *.jpg)");

D、文件对话框实用函数

QFileDialog定义了多个静态成员函数用于直接使用文件对话框。

QString getOpenFileName(QWidget * parent = 0, const QString & caption = QString(), const QString & dir = QString(), const QString & filter = QString(), QString * selectedFilter = 0, Options options = 0)

QStringList getOpenFileNames(QWidget * parent = 0, const QString & caption = QString(), const QString & dir = QString(), const QString & filter = QString(), QString * selectedFilter = 0, Options options = 0)

QString getSaveFileName(QWidget * parent = 0, const QString & caption = QString(), const QString & dir = QString(), const QString & filter = QString(), QString * selectedFilter = 0, Options options = 0)

4、颜色对话框QColorDialog

QT中也提供了预定义的颜色对话框类QColorDialog。颜色对话框使用方式如下:

A、创建颜色对话框QColorDialog对象

QColorDialog cdialog(this);

B、颜色对话框属性设置

cdialog.setWindowTitle("Color Editer");

//设置初始颜色

cdialog.setCurrentColor(Qt::red);

if(cdialog.exec() == QColorDialog::Accepted)

{

qDebug() << cdialog.selectedColor();

}

C、QColor

QT中使用QColor表示颜色,支持多种颜色的表示方法。

RGB:红、绿、蓝为基准的三色模型

HSV:色调、饱和度、明度为基准的六角锥体模型

CMYK:天蓝、品红、黄色、黑为基准的全彩印刷色彩模型

QColor支持在三种颜色模型间转换。

QColor color = dlg.selectedColor();

qDebug() << color;

qDebug() << color.red();

qDebug() << color.green();

qDebug() << color.blue();

qDebug() << color.hue();

qDebug() << color.saturation();

qDebug() << color.value();

D、QColorDialog实用函数

QColorDialog定义了直接使用颜色对话框的静态成员函数。

QColor getColor(const QColor & initial, QWidget * parent, const QString & title, ColorDialogOptions options = 0)

QColor getColor(const QColor & initial = Qt::white, QWidget * parent = 0)

5、输入对话框QInputDialog

QT中提供了预定义的输入对话框类QInputDialog,用于需要临时进行数据输入的场合。

输入对话框的使用方法如下:

A、创建输入对话框对象

QInputDialog idialog(this);

B、输入对话框属性设置

idialog.setWindowTitle("Enter Data");

idialog.setLabelText("Please Enter a int:");

idialog.setInputMode(QInputDialog::IntInput);

if(idialog.exec() == QInputDialog::Accepted)

{

qDebug() << idialog.intValue();

}

C、输入对话框的输入模式

QInputDialog::TextInput输入文本字符串

QInputDialog::IntInput输入整型数

QInputDialog::DoubleInput输入浮点数

D、QInputDialog的实用函数

QInputDialog定义了多个静态成员函数,直接调用使用输入对话框。

double getDouble(QWidget * parent, const QString & title, const QString & label, double value = 0, double min = -2147483647, double max = 2147483647, int decimals = 1, bool * ok = 0, Qt::WindowFlags flags = 0)

int getInt(QWidget * parent, const QString & title, const QString & label, int value = 0, int min = -2147483647, int max = 2147483647, int step= 1, bool * ok = 0, Qt::WindowFlags flags = 0)

QString getItem(QWidget * parent, const QString & title, const QString & label, const QStringList & items, int current = 0, bool editable = true, bool *ok = 0, Qt::WindowFlags flags = 0)

QString getText(QWidget * parent, const QString & title, const QString & label, QLineEdit::EchoMode mode = QLineEdit::Normal, const QString &text = QString(), bool * ok = 0, Qt::WindowFlags flags = 0)

6、字体对话框QFontDialog

QT中提供了预定义的字体对话框类QFontDialog,用于提供选择字体的对话框部件。

字体对话框的使用方法如下:

A、创建字体对话框对象

QFontDialog fdialog(this);

B、字体对话框属性设置

fdialog.setWindowTitle("Select Font");

fdialog.setCurrentFont(QFont("Courier New", 10, QFont::Bold));

if(fdialog.exec() == QFontDialog::Accepted)

{

qDebug() << fdialog.selectedFont();

}

C、QFontDialog实用函数

QFontDialog定义了静态成员函数,直接调用可以使用字体对话框选择字体。

QFont getFont(bool * ok, const QFont & initial, QWidget * parent, const QString & title, FontDialogOptions options)

QFont getFont(bool * ok, const QFont & initial, QWidget * parent, const char * name)

QFont getFont(bool * ok, QWidget * parent, const char * name)

QFont getFont(bool * ok, const QFont & initial, QWidget * parent, const QString & title)

QFont getFont(bool * ok, const QFont & initial, QWidget * parent = 0)

QFont getFont(bool * ok, QWidget * parent = 0)

7、进度对话框QProgressDialog

QT提供了预定义的进度对话框类QProgressDialog,用于显示进度信息和需要用户等待的场合。

进度对话框的使用方法如下:

A、创建进度对话框对象

QProgressDialog pdialog(this);

B、进度对话框属性设置

pdialog.setWindowTitle("Progress.....");

pdialog.setLabelText("The application having done at ....");

pdialog.setMaximum(100);

pdialog.setMinimum(0);

pdialog.setValue(30);

pdialog.exec();

8、打印对话框QPrintDialog

QT中提供了预定义的打印对话框类QPrintDialog,用于设置打印相关的参数信息。

打印对话框的使用方法如下:

A、创建打印对话框对象

QPrintDialog prdialog(this);

B、打印对话框属性设置

prdialog.setWindowTitle("Setting the Printer");

if(prdialog.exec() == QPrintDialog::Accepted)

{

QPrinter *p = prdialog.printer();

QTextDocument td;

td.setPlainText("Hello world!");

p->setOutputFileName("d:\\hello.pdf");

td.print(p);

}

C、QPrinter类

QT中的QPrinter类是打印设备及其参数的封装,封装了系统中打印设备的驱动接口,以相同方式使用系统中的不同打印设备。

五、窗体之间数据的传递

QT窗体之间数据的传递有三种方式:信号槽机制、公有函数接口、全局变量。

1、QT信号槽传递

在发送数据的窗体类中定义带参数的信号,发送信号;在接收数据的窗体中定义接收数据的槽函数;将发送数据的信号和接收数据的槽函数连接。

声明信号:

signals:

void sendData(QString);

发送信号(带参数内容):

emit sendData(lineEdit->text());

定义槽函数(带参数内容):

private slots:

void receiveData(QString data);

连接信号与槽:

connect(sender,SIGNAL(sendData(QString)),receiver,SLOT(receiveData(QString)));

2、公有函数接口传递

使用公有成员函数接口可以在不同类外调用类的成员函数,返回需要的数据。

3、全局变量传递

全局变量可以在一个文件中定义,其他文件中声明后使用,实现数据的共享传递。

六、登录对话框实例

登录对话框是应用程序常用的部件。

1、登录对话框需求分析

登录对话框需求分析:

A、作为可复用的软件部件

B、获取用户名和密码

C、随机码验证

2、登录对话框的架构

登录对话框的设计和架构

对话框之间通过成员变量和成员函数传递数据,将用户数据保存在私有成员变量中,通过公有成员函数进行数据传递。

3、登录对话框类设计

#ifndef QLOGINDIALOG_H
#define QLOGINDIALOG_H
#include <QDialog>
#include <QLineEdit>
#include <QPushButton>
#include <QLabel>
class QLoginDialog: public QDialog
{
    Q_OBJECT
private:
    QLabel UserLabel;
    QLabel PwdLabel;
    QLineEdit UserEdit;
    QLineEdit PwdEdit;
    QPushButton B_Login;
    QPushButton B_Cancel;
    QString m_user;
    QString m_pwd;
public:
    QLoginDialog(QWidget *parent);
    QString getUser();
    QString getPwd();
    ~QLoginDialog();
private slots:
    void Login();
    void Cancel();
};
#endif // QLOGINDIALOG_H

实现文件:

#include "QLoginDialog.h"
#include <QDebug>
#include <QMessageBox>
 
QLoginDialog::QLoginDialog(QWidget *parent)
    :QDialog(parent, Qt::WindowCloseButtonHint), UserLabel(this),
PwdLabel(this),
      UserEdit(this), PwdEdit(this), B_Login(this),B_Cancel(this)
{
    UserLabel.setText("User ID:");
    UserLabel.move(50, 50);
    UserLabel.resize(60, 30);
    UserEdit.move(110, 50);
    UserEdit.resize(200, 30);
    PwdLabel.setText("Password:");
    PwdLabel.move(50, 100);
    PwdLabel.resize(60,30);
    PwdEdit.move(110, 100);
    PwdEdit.resize(200, 30);
    PwdEdit.setEchoMode(QLineEdit::Password);
    B_Login.setText("Login");
    B_Login.move(110, 150);
    B_Login.resize(80, 30);
    B_Cancel.setText("Cancel");
    B_Cancel.move(230, 150);
    B_Cancel.resize(80, 30);
    setWindowTitle("Login Window");
    setFixedSize(400, 300);
    connect(&B_Login, SIGNAL(clicked()), this, SLOT(Login()));
    connect(&B_Cancel, SIGNAL(clicked()), this, SLOT(Cancel()));
}
QString QLoginDialog::getUser()
{
    return m_user;
}
QString QLoginDialog::getPwd()
{
    return m_pwd;
}
void QLoginDialog::Login()
{
    qDebug() << "login";
    m_user = UserEdit.text().trimmed();
    m_pwd = PwdEdit.text();
    if(!(m_user.isEmpty() || m_pwd.isEmpty()))
    {
        done(Accepted);
    }
    else
    {
        QMessageBox mb(this);
        mb.setWindowTitle("Warning Message");
        mb.setIcon(QMessageBox ::Warning);
        mb.setText("User or PassWord can‘t empty! \nPlease check your username or password!");
        mb.setStandardButtons(QMessageBox::Ok);
        mb.exec();
    }
}
void QLoginDialog::Cancel()
{
    qDebug() << "cancel";
    done(Rejected);
}
QLoginDialog::~QLoginDialog()
{
}
时间: 2024-08-02 06:58:14

QT开发(二十)——QT对话框的相关文章

QT开发(十二)——QT事件处理机制

QT开发(十二)--QT事件处理机制 一.QT事件简介 QT程序是事件驱动的, 程序的每个动作都是由内部某个事件所触发.QT事件的发生和处理成为程序运行的主线,存在于程序整个生命周期. 常见的QT事件类型如下: 键盘事件: 按键按下和松开 鼠标事件: 鼠标移动,鼠标按键的按下和松开 拖放事件: 用鼠标进行拖放 滚轮事件: 鼠标滚轮滚动 绘屏事件: 重绘屏幕的某些部分 定时事件: 定时器到时 焦点事件: 键盘焦点移动 进入和离开事件: 鼠标移入widget之内,或是移出 移动事件: widget的

QT开发(十六)——QT绘图实例-钟表

QT开发(十六)--QT绘图实例-钟表 一.钟表实现原理 钟表的实现需要设置定时器,定时器每隔一秒发送timeout()信号到QWidget::update()槽函数,update()槽函数将会重绘一次窗口,重写重绘事件函数paintEvent(QPaintEvent *event),根据获取的当前系统时间的时钟.分钟.秒钟重绘钟表的时针.分针.秒针. QTimer *timer = new QTimer(this); timer->start(1000);//一秒钟 connect(timer

QT开发(十九)——QT内存泄漏问题

QT开发(十九)--QT内存泄漏问题 一.QT对象间的父子关系 QT最基础和核心的类是:QObject,QObject内部有一个list,会保存children,还有一个指针保存parent,当自己析构时,会自己从parent列表中删除并且析构所有的children. QT对象之间可以存在父子关系,每一个对象都可以保存它所有子对象的指针,每一个对象都有一个指向其父对象的指针. 当指定QT对象的父对象时,父对象会在子对象链表中加入该对象的指针,该对象会保存指向其父对象的指针. 当QT对象被销毁时,

QT开发(十四)——QT绘图系统

QT开发(十四)--QT绘图系统 一.QT绘图原理 Qt4中的2D绘图系统称为Arthur绘图系统,可以使用相同的API在屏幕上和绘图设备上进行绘制,主要基于QPainter.QPainterDevice和 QPainterEngine.QPainter执行绘图操作,QPainterDevice提供绘图设备,是一个二维空间的抽象,QPainterEngine提供一些接口.QPainter用来执行具体的绘图相关操作,如画点,画线,填充,变换,alpha通道等.QPaintDevice类是能够进行绘

QT开发(十五)——QT坐标系统

QT开发(十五)--QT坐标系统 一.QT坐标系简介 Qt中每一个窗口都有一个坐标系,默认窗口左上角为坐标原点,然后水平向右依次增大,水平向左依次减小,垂直向下依次增大,垂直向上依次减小.原点即为(0,0)点,以像素为单位增减. 二.坐标系变换 坐标系变换是利用变换矩阵来进行的, 通常利用QTransform类来设置变换矩阵.QPainter类提供了对坐标系的平移,缩放,旋转,扭曲等变换函数. void translate(const QPointF & offset) void transla

QT学习二 按钮新建对话框

mainwindow新建方法MainWindowOpen打开一个新的对话框 mainWindow.h 1 #ifndef MAINWINDOW_H 2 #define MAINWINDOW_H 3 4 #include <QMainWindow> 5 6 namespace Ui { 7 class MainWindow; 8 } 9 10 class MainWindow : public QMainWindow 11 { 12 Q_OBJECT 13 14 public: 15 expli

QT开发(二) windows下简单部署

如果使用vs编译器 需要c runtime 例如(msvc110 )这种 还需要若干qt的dll 基本在qt的bin目录 如果使用了QWindow这种对象还需要引用qt目录 plugins下 的内容 和qml文件夹的内容,plugins包括了一些扩展功能 qml提供了基础控件的qml(对应在qml文件中import的内容 ) 可以利用的工具 depends,procexp 最后一个部署的环境截图

python运维开发(二十)----models操作、中间件、缓存、信号、分页

内容目录 select Form标签数据库操作 models操作F/Q models多对多表操作 Django中间件 缓存 信号 分页 select Form标签补充 在上一节中我们可以知道Form标签有两个作用,一个做用户提交数据验证,一个是生成HTML标签 在生成HTML标签中可以生成select标签,select的选项数据我们可以在数据库中查询读取到. class UserType(models.Model): caption = models.CharField(max_length=1

python运维开发(二十五)---cmdb开发

内容目录: 浅谈ITIL CMDB介绍 Django自定义用户认证 Restful 规范 资产管理功能开发 浅谈ITIL TIL即IT基础架构库(Information Technology Infrastructure Library, ITIL,信息技术基础架构库)由英国政府部门CCTA(Central Computing and Telecommunications Agency)在20世纪80年代末制订,现由英国商务部OGC(Office of Government Commerce)负

Qt开发学习教程

Qt开发学习教程 一.Qt开发基础学习教程 本部分博客主要根据狄泰学院唐老师的<QT实验分析教程>创作,同时根据天山老妖自己的理解和网络搜集的资料及QT官方文档对部分知识点进行了扩展.本系列博客由天山老妖创作,发布于51CTO博客上.狄泰学院网站:http://course.dt4sw.com/ Qt开发基础学习教程目录如下: QT开发(一)--QT简介http://blog.51cto.com/9291927/1856911QT开发(二)--QT开发环境搭建http://blog.51cto