首页 > 编程知识 正文

qt实现高级UI效果,qt做ui界面

时间:2023-05-05 13:14:49 阅读:190488 作者:3724

1 .创建项目修改组件的对象名称,显示文本内容,创建小部件APP类QDialog,创建窗体时选择基类QDialog,并将生成的类命名为QWDialog

在设计接口时,请修改要访问的组件的对象名称。 例如,需要各按钮、输入的编辑框的读取、为了在程序内进行区别而显示结果的标签等。 对于不需要访问程序的组件,不需要更改objectName,如接口上的组

条件组合的GroupBox、Frame、布局等只要让UI设计师自动命名即可。

objectName是在表单中创建的组件的实例名称,且必须是唯一的。 这是因为程序访问组件是通过objectName访问的。 表单的objectName是表单的类名,请勿在UI设计器中更改表单的objectName。 表单的实例名称必须在使用表单的代码中定义。

2、接口组件布局2.1、接口组件层次关系。 使用容器类:如QgoupBox、QtabWidget、QFrame等。

例如,可以将三个CheckBox组件放在一个GroupBox组件中。 此GroupBox组件是这三个CheckBox的容器,移动此GroupBox会同时移动其中三个CheckBox。 在窗体中放置两个GroupBox组件,并在groupBox1中放置三个CheckBox

2.2、布局管理2.2.1、调色板中的布局和空间

2.2.2、工具栏:协调设计师进入不同状态,进行布局设计。

单击要布局的组件,然后单击布局按钮

如果在窗体中选择组件,Ctrl可以实现组件的多项选择,从而在容器中选择组件。 这与选择其内部的所有组件的情况相同。 现在,选择两个组框,然后单击“Lay Out Horizontally”以实现水平布局

3、信号和时隙是一个函数。 时隙函数可以与一个信号相关联,当传输信号时,自动执行相关的时隙函数。

信号和槽的关联由QObject:connect () )函数实现,其基本格式如下:

q object :3360连接(sender,signal(signal ),receiver,slot ) ); connect ) )是QObject类的静态函数,而QObject是所有Qt类的基类,在实际调用中可以忽略前面的修饰符,因此可以直接写:

connect(sender,signal )、signal )、receiver,slot )、slot ) )其中:

sender是发送信号的对象的名称,signal ()是信号名称。 信号可以视为特殊函数,必须有括号,如果有参数,则必须指定参数。 receiver的传入信号对象名称slot ()是插槽函数的名称,带括号,如果有参数,则必须指定参数。 SIGNAL和STOT是Qt的宏,指示信号和插槽,并将它们的参数转换为适当的字符串。

)一个信号可以连接多个插槽。 例如:

connect(spinnum,signal ) valuechanged(int ) )、this,slot ) addfun ) int ); connect(spinnum,signal ) valuechanged(int ) )、this,slot ) updatestatus (int ); 它用于在一个对象的spinNum值发生变化时,在相应的表单中有两个插槽,一个用于计算(addFun ),另一个用于更新(updateStatus )中的状态。 如果一个信号与多个插槽函数相关联,则插槽函数将按照建立连接的顺序运行。 如果信号函数和槽函数有参数,则connect ()函数会注明参数的类型,但可以不写参数名称。 )2)多个信号可以连接到同一个时隙

例如,在项目设计中,选择颜色的3个RadioButton的clicked )信号与一个相同的定制时隙函数setTextFontColor )相关联。

connect(ui-RBTnblue,signal(clicked ) )、this,slot (settext font color ) ) connect(ui-rbtnred,signal (clical ) ) connect(ui-rbtnblack,signal(clicked ) )、this,slot (settext font color ) )这样,当单击其中一个RadioButton时

)3)一个信号可以连接到另一个信号

例如:

connect(spinnum,signal ) valuechanged(int ) )、this,signal ) refreshinfo ) int ); 这样,即使在发射一个信号时

会发射另外一个信号,实现某些特殊的功能。


(4)严格的情况下,信号与槽的参数个数和类型需要一致,至少信号的参数不能少于槽的参数。如果不匹配,会出现编译错误或运行错误。
(5)在使用信号与槽的类中,必须在类的定义中加入宏 Q_OBJECT
(6)当一个信号被发射时,与其关联的槽函数通常被立即执行,就像正常调用一个函数一样。
        只有当信号关联的所有槽函数执行完毕后,才会执行发射信号处后面的代码

4 可视化生成槽函数原型和框架

下面开始设计程序功能。对于该程序,希望它的功能如下。

单击 UnderLine、Italic、Bold 3 个 CheckBox 时,根据其状态,设置 PlainTextEdit 里的文字的字体样式;Black、Red、Blue 3 个 RadioButton 是互斥选择的,单击某个 RadioButton 时,设置文字的颜色;单击“确定”“取消”或“退出”按钮时,关闭窗口,退出程序。4.1、字体样式设置

选中chkBoxUnder 组件---->“Go to slot…”,出现下面的对话框:列出了QCheckBox类的所有信号,第一个是clicked(),第2个是带bool参数的clicked(bool)

信号clicked():需要在代码中读取CheckBox组件的选中状态信号号 clicked(bool):将CheckBox组件当前的选择状态作为一个参数传递,在响应代码中可以直接利用这个传递的参数

选择 clicked(bool),然后单击“OK”按钮,在 QWDialog 的类定义中,会在 private slots 部分自动增加一个槽函数声明,函数名是根据发射对象及其信号名称自动命名的。

void on_chkBoxUnder_clicked(bool checked); 

同时,在 qwdialog.cpp 文件中自动添加了函数 on_chkBoxUnder_clicked(bool)的框架。添加代码

void QWDialog::on_chkBoxUnder_clicked(bool checked){ QFont font = ui->txtEdit->font(); font.setUnderline(checked); ui->txtEdit->setFont(font);}

以同样的方法为 Italic 和 Bold 两个 CheckBox 设计槽函数,编译后运行,发现已经实现了修改字体的下划线、斜体、粗体属性的功能,说明信号与槽函数已经关联了。

QWDialog 的构造函数执行ui->setupUi(this); ------->的 ui_qwdialog.h 中setupUi有:

QMetaObject::connectSlotsByName(QWDialog);

connectSlotsByName<QWDialog>函数将搜索QWDialog界面上的所有组件,将信号与槽函数的信号和槽关联起来。它假设槽函数的名称是:void on_<object name>_<signal name>(<signal parameters>)

比如,通过UI设计器的操作,为chkBoxUnder自动生成的槽函数是:void QWDialog::on_chkBoxUnder_clicked(bool checked)。那么,connectSlotsByName()就会将此信号和槽函数关联起来,如同执行了下面的这样一条语句:
connect(chkBoxUnder, SIGNAL(clicked (bool)),  this, SLOT (on_chkBoxUnder_clicked (bool)); 

这就是用 UI 设计器可视化设计某个组件的信号响应槽函数,而不用手工去将其关联起来的原因,都是在界面类的构造函数里调用 setupUi()自动完成了关联。

总结:

1、选中组件--->go to slot---->clicked(bool)----->添加代码

2、checkBox可以同时选中

4.2、字体颜色设置

设置字体的 3 个 RadioButton 是互斥性选择的,即一次只有一个 RadioButton 被选中,虽然也可以采用可视化设计的方式设计其 clicked()信号的槽函数,但是这样就需要生成 3 个槽函数。这里可以简化设计,即设计一个槽函数,将 3 个 RadioButton 的 clicked()信号关联到这一个槽函数。为此,在 QWDialog 类的 private slots 部分增加一个槽函数定义如下:

void setTextFontColor();

提示 将鼠标光标移动到这个函数的函数名上面,单击右键,在弹出的快捷菜单中选择“Refactor”→“Add Definition in qwdialog.cpp”,就可以在 qwdialog.cpp 文件中自动为函数 setTextFontColor()生成一个函数框架。

void QWDialog::setTextFontColor(){ QPalette Plet = ui->txtEdit->palette(); if(ui->rBtnBlack->isChecked()) Plet.setColor(QPalette::Text, Qt::black); else if(ui->rBtnBlue->isChecked()) Plet.setColor(QPalette::Text, Qt::blue); else if(ui->rBtnRed->isChecked()) Plet.setColor(QPalette::Text, Qt::red); ui->txtEdit->setPalette(Plet);}

由于这个槽函数是自定义的,所以不会自动与 RadioButton 的 clicked()事件关联,此时编译后运行程序不会实现改变字体颜色的功能。需要在 QWDialog 的构造函数中手工进行关联,代码如下

QWDialog::QWDialog(QWidget *parent) : QDialog(parent), ui(new Ui::QWDialog){ ui->setupUi(this); connect(ui->rBtnBlack, SIGNAL(clicked()), this, SLOT(setTextFontColor())); connect(ui->rBtnBlue, SIGNAL(clicked()), this, SLOT(setTextFontColor())); connect(ui->rBtnRed, SIGNAL(clicked()), this, SLOT(setTextFontColor()));}

总结:1、QWDialog 类的 private slots声明槽函数:void setTextFontColor();点击函数名Refactor生成在qwdialog.cpp生成函数框架,并补全函数。

2、在qwdialog.cpp的构造函数里面手动关联

3、RadioButton为单选框

4.3、按钮功能设置

“确定”表示确认选择并关闭对话框,“取消”表示取消选择并关闭对话框,“退出”则直接关闭对话框。

QWDialog是从QDialog继承而来的,QDialog提供了accept(),erject(),close()等槽函数来表示这三种状态,只需要将按钮的clicked()信号与相应槽函数关联即可。

在 UI 设计器里,单击上方工具栏里的“Edit Signals/Slots”按钮[快捷键为F4,取消为F3],窗体进入信号与槽函数编辑状态。

将鼠标移动到“确定”按钮上方,再按下鼠标左键,移动到窗体的空白区域释放左键,这时出现[确定&窗口]关联对话框

左侧的列表框里显示了 btnOK 的信号,选择 clicked(),右边的列表框里显示了QWDialog 的槽函数,选择 accept(),单击“OK”按钮btnCancel 的 clicked()信号与 QWDialog 的 reject()槽函数关联 btnClose的 clicked()信号与 QWDialog 的 close()槽函数关联。右侧列表框中没有 close()槽函数,需要勾选下方的“Show signals and slots inherited from QWidget”才会出现 close()函数。

设置完 3 个按钮的信号与槽关联之后,在窗体下方的 Signals 和 Slots 编辑器里也显示了这 3个关联。实际上,可以直接在 Signals 和 Slots 编辑器进行关联设置。现在编译并运行程序,单击这 3 个按钮都会关闭程序。

现在编译并运行程序,单击这 3 个按钮都会关闭程序。

那么,这 3 个按钮的信号与槽函数的关联是在哪里实现的呢?答案在 setupUi()函数里,在setupUi()函数里自动增加了以下 3 行代码:

QObject::connect(btnOK, SIGNAL(clicked()), QWDialog, SLOT(accept()));QObject::connect(btnCancel, SIGNAL(clicked()), QWDialog, SLOT(reject()));QObject::connect(btnClose, SIGNAL(clicked()), QWDialog, SLOT(close()));

 

 

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。