大宇私人领地伊甸园丨宁愿做了后悔,也不要错过后悔[www.mrdayu.com]
注册

24小时联系邮箱:[email protected]

系统架构
您现在的位置: 首页 > 系统架构 > QT > 《大宇:Qt入门到精通》 > [008]Designer快速设计对话框

[008]Designer快速设计对话框

发布时间:2017/11/24 《大宇:Qt入门到精通》 标签Designerqt浏览次数:93

引:前面文章介绍的为Qt设计师界面类的使用方法,会在选择创建的时候自动创建的.h和.cpp文件,假如使用Designer的话只会生成ui文件,今天这章带来的为您带来,如何自己去实现一个Qt设计师界面编译器帮你做过的一些事情。

首先:

然后点击下一步:

最后点击完成:

实际上和创建Qt设计师界面类没什么区别,唯一的不同点就在于,Designer不会自动生成.h和.cpp文件。

和原来一样,拖出一个界面:

然后保存。

pro文件强调下,在QT5后必须手动添加。

这里特别注意,这个ui的object名字一定要记住:

ui_*.h为qmake自动检测是否有ui文件,顺便生成makefile文件,然后调用uic工具将*.ui文件转换成C++文件,UI::Form为刚刚的objectname的值,而不是左侧的文件名。

Ui_*文件:

文件中包含了Ui::objectname的定义,该类的是一个与*.ui文件等价的C++文件。这个类声明了一些成员变量,它们存储着窗体中的子窗口部件和子布局,以及用于初始化窗体的setupUi()函数。

然后添加一个main.cpp文件:

Ui::Form生成的类没有继承任何基类,在main.cpp文件中可以定义一个继承于QWidget类的子类或QWidget类指针,传进setupUi()函数,函数会对其进行一系列改造。

setupUi源码:

void setupUi(QWidget *Form)
    {
        if (Form->objectName().isEmpty())
            Form->setObjectName(QStringLiteral("Form"));
        Form->resize(222, 71);
        verticalLayout = new QVBoxLayout(Form);
        verticalLayout->setObjectName(QStringLiteral("verticalLayout"));
        horizontalLayout = new QHBoxLayout();
        horizontalLayout->setObjectName(QStringLiteral("horizontalLayout"));
        label = new QLabel(Form);
        label->setObjectName(QStringLiteral("label"));

        horizontalLayout->addWidget(label);

        lineEdit = new QLineEdit(Form);
        lineEdit->setObjectName(QStringLiteral("lineEdit"));

        horizontalLayout->addWidget(lineEdit);


        verticalLayout->addLayout(horizontalLayout);

        horizontalLayout_2 = new QHBoxLayout();
        horizontalLayout_2->setObjectName(QStringLiteral("horizontalLayout_2"));
        horizontalSpacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);

        horizontalLayout_2->addItem(horizontalSpacer);

        pushButton = new QPushButton(Form);
        pushButton->setObjectName(QStringLiteral("pushButton"));

        horizontalLayout_2->addWidget(pushButton);

        pushButton_2 = new QPushButton(Form);
        pushButton_2->setObjectName(QStringLiteral("pushButton_2"));

        horizontalLayout_2->addWidget(pushButton_2);


        verticalLayout->addLayout(horizontalLayout_2);


        retranslateUi(Form);

        QMetaObject::connectSlotsByName(Form);
    } // setupUi

其实,这只是一个开始:

现在运行的这个程序,什么地方都显示出来了,唯独没什么用,OK键和Cancel以及编辑器没什么实质上的作用。

下面,我们就开始来加一些代码,但~~~你见过所有功能实现放main函数中的吗?

没有!所以,我们可以创建一个新类继承QWidget和Ui::Form类,将你想要的功能全部添加进去。然后命名惯例,将objectname作为.类的文件名。

添加:

 

#ifndef ****
#define ****
#include <QWidget>
#include “ui_***.h”
Class Form:public QWidget,public Ui::Form{
Q_OBJECT
Public:
Form(QWidgets *parent=0);
Public:
***
},
#endif

然后在cpp文件中实现:

Form(QWidgets *parent=0);

Form(QWidgets *parent=0):QWidget(parent){

setupUi(this);//初始化窗体

****

}

具体实现:

mywidget.h文件:

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include "ui_mywidget.h"

class mywidget : public QWidget,public Ui::Form
{
    Q_OBJECT
public:
    explicit mywidget(QWidget *parent = nullptr);

signals:

private slots:
    void on_lineEdit_textChanged();
};

#endif // MYWIDGET_H

mywidget.cpp文件:

#include "mywidget.h"

mywidget::mywidget(QWidget *parent) : QWidget(parent)
{
    setupUi(this);
    QRegExp regExp("[A-Za-z][1-9][0-9]{0,2}");
    lineEdit->setValidator(new QRegExpValidator(regExp, this));

    connect(pushButton, SIGNAL(clicked()), this, SLOT(accept()));
    connect(pushButton_2, SIGNAL(clicked()), this, SLOT(reject()));
}
void mywidget::on_lineEdit_textChanged()
{
    okButton->setEnabled(lineEdit->hasAcceptableInput());
}

main函数的更改:

#include <QApplication>
#include "mywidget.h"


int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    mywidget *dialog = new mywidget();

    dialog->show();
    return app.exec();
}

最终图像:

56.2K

您好!请登录

合作网站快捷登录:
点击取消回复

已有0评论

    购物盒子

    点击这里给我发消息点击这里给我发消息