一、UI布局
- 新建项目的时候选择 QMainWindow
- 一开始进去的时候QT Designer是灰色的不能用,解决方法:
(1)点击IDE左下角的Debug
(2)去Forms文件夹里双击.ui文件就可以了
- 详解布局
(1) 5.14.2版本的有四种布局,在右边
(2)选中空白区域,点击上面一栏任意布局,整体的布局就变了;整体布局在右边查看(根据centralwidget左边的图案判断)
(3)红色箭头指向的地方可以取消选中的布局
(4)怎样设计布局?
首先要有控件
,选中控件以后再去点布局。
- 计算器的布局设计
右边两个红色的框框出来的是控件的名字,写mainwindow.cpp文件时需要用到,具体用法是ui->控件名字
。
二、在头文件中添加凹槽、必要的成员变量
- 文件mainwindow.h
- 在private处添加必要的成员变量,作用见注释
- 凹槽slots对应着某个事件发生后,触发的那个函数。
- 添加的内容如下
private:
int empty = 1; // empty=1时,应该向label_value1输入; empty=2时,应该向label_value2输入
int sign = 0; // 记录label_sign里的符号是什么,1=add;2=sub;4=div;3=mul
private slots:
void onPushButton_0_Clicked();
void onPushButton_1_Clicked();
void onPushButton_2_Clicked();
void onPushButton_3_Clicked();
void onPushButton_4_Clicked();
void onPushButton_5_Clicked();
void onPushButton_6_Clicked();
void onPushButton_7_Clicked();
void onPushButton_8_Clicked();
void onPushButton_9_Clicked();
void onPushButton_add_Clicked();
void onPushButton_sub_Clicked();
void onPushButton_mul_Clicked();
void onPushButton_div_Clicked();
void onPushButton_equ_Clicked();
void onPushButton_clear_Clicked();
三、完整project(粘过去就能运行的那种)
思路:
为了简单起见,我将输入框拆成了两个(这样就不用切割字符串了哈哈哈),用empty这个成员变量来判断应该写入第一个还是第二个。实现的逻辑非常简单啦,逻辑只写了一个小时左右,下面的注释也很清晰,应该能看懂。
- mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
int empty = 1; // empty=1时,应该向label_value1输入; empty=2时,应该向label_value2输入
int sign = 0; // 记录label_sign里的符号是什么,1=add;2=sub;4=div;3=mul
private slots:
void onPushButton_0_Clicked();
void onPushButton_1_Clicked();
void onPushButton_2_Clicked();
void onPushButton_3_Clicked();
void onPushButton_4_Clicked();
void onPushButton_5_Clicked();
void onPushButton_6_Clicked();
void onPushButton_7_Clicked();
void onPushButton_8_Clicked();
void onPushButton_9_Clicked();
void onPushButton_add_Clicked();
void onPushButton_sub_Clicked();
void onPushButton_mul_Clicked();
void onPushButton_div_Clicked();
void onPushButton_equ_Clicked();
void onPushButton_clear_Clicked();
};
#endif // MAINWINDOW_H
- main.cpp不用动
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
//w.setMouseTracking(true);
w.show();
return a.exec();
}
- mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
/*-------------连接各个按钮的信号和槽----------------*/
connect( ui->pushButton_0,SIGNAL(clicked()),this,SLOT(onPushButton_0_Clicked()));
connect( ui->pushButton_1,SIGNAL(clicked()),this,SLOT(onPushButton_1_Clicked()));
connect( ui->pushButton_2,SIGNAL(clicked()),this,SLOT(onPushButton_2_Clicked()));
connect( ui->pushButton_3,SIGNAL(clicked()),this,SLOT(onPushButton_3_Clicked()));
connect( ui->pushButton_4,SIGNAL(clicked()),this,SLOT(onPushButton_4_Clicked()));
connect( ui->pushButton_5,SIGNAL(clicked()),this,SLOT(onPushButton_5_Clicked()));
connect( ui->pushButton_6,SIGNAL(clicked()),this,SLOT(onPushButton_6_Clicked()));
connect( ui->pushButton_7,SIGNAL(clicked()),this,SLOT(onPushButton_7_Clicked()));
connect( ui->pushButton_8,SIGNAL(clicked()),this,SLOT(onPushButton_8_Clicked()));
connect( ui->pushButton_9,SIGNAL(clicked()),this,SLOT(onPushButton_9_Clicked()));
connect( ui->pushButton_clear,SIGNAL(clicked()),this,SLOT(onPushButton_clear_Clicked())); //清除
connect( ui->pushButton_equ,SIGNAL(clicked()),this,SLOT(onPushButton_equ_Clicked())); //出结果
connect( ui->pushButton_add,SIGNAL(clicked()),this,SLOT(onPushButton_add_Clicked())); //加
connect( ui->pushButton_sub,SIGNAL(clicked()),this,SLOT(onPushButton_sub_Clicked())); //减
connect( ui->pushButton_mul,SIGNAL(clicked()),this,SLOT(onPushButton_mul_Clicked())); //乘
connect( ui->pushButton_div,SIGNAL(clicked()),this,SLOT(onPushButton_div_Clicked())); //除
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::onPushButton_0_Clicked(){
if(empty==1){ //仍在输入value1
if(ui->label_value1->text().toInt()==0){
ui->label_value1->setText("0"); //用0覆盖0
}else{
ui->label_value1->setText(ui->label_value1->text()+"0"); //后缀一个字符串“0”
}
}else if(empty==2){ //仍在输入value2
if(ui->label_value2->text().toInt()==0){
ui->label_value2->setText("0"); //用0覆盖0
}else{
ui->label_value2->setText(ui->label_value2->text()+"0"); //后缀一个字符串“0”
}
}
}
void MainWindow::onPushButton_1_Clicked(){
/*-----打印发送者---
QObject *obj = sender(); //获取发送者
QString name = obj->objectName(); //或qDebug(QPrintable(obj->objectName()));
qDebug(name); //或qDebug("%s",name);
----------------*/
if(empty==1){ //仍在输入value1
if(ui->label_value1->text().toInt()==0){
ui->label_value1->setText("1"); //用1覆盖0
}else{
ui->label_value1->setText(ui->label_value1->text()+"1"); //后缀一个字符串“1”
}
}else if(empty==2){ //仍在输入value2
if(ui->label_value2->text().toInt()==0){
ui->label_value2->setText("1"); //用1覆盖0
}else{
ui->label_value2->setText(ui->label_value2->text()+"1"); //后缀一个字符串“1”
}
}
}
void MainWindow::onPushButton_2_Clicked(){
if(empty==1){ //仍在输入value1
if(ui->label_value1->text().toInt()==0){
ui->label_value1->setText("2"); //用2覆盖0
}else{
ui->label_value1->setText(ui->label_value1->text()+"2"); //后缀一个字符串“2”
}
}else if(empty==2){ //仍在输入value2
if(ui->label_value2->text().toInt()==0){
ui->label_value2->setText("2"); //用2覆盖0
}else{
ui->label_value2->setText(ui->label_value2->text()+"2"); //后缀一个字符串“1”
}
}
}
void MainWindow::onPushButton_3_Clicked(){
if(empty==1){ //仍在输入value1
if(ui->label_value1->text().toInt()==0){
ui->label_value1->setText("3"); //用3覆盖0
}else{
ui->label_value1->setText(ui->label_value1->text()+"3"); //后缀一个字符串“3”
}
}else if(empty==2){ //仍在输入value2
if(ui->label_value2->text().toInt()==0){
ui->label_value2->setText("3"); //用3覆盖0
}else{
ui->label_value2->setText(ui->label_value2->text()+"3"); //后缀一个字符串“3”
}
}
}
void MainWindow::onPushButton_4_Clicked(){
if(empty==1){ //仍在输入value1
if(ui->label_value1->text().toInt()==0){
ui->label_value1->setText("4"); //用4覆盖0
}else{
ui->label_value1->setText(ui->label_value1->text()+"4"); //后缀一个字符串“4”
}
}else if(empty==2){ //仍在输入value2
if(ui->label_value2->text().toInt()==0){
ui->label_value2->setText("4"); //用4覆盖0
}else{
ui->label_value2->setText(ui->label_value2->text()+"4"); //后缀一个字符串“4”
}
}
}
void MainWindow::onPushButton_5_Clicked(){
if(empty==1){ //仍在输入value1
if(ui->label_value1->text().toInt()==0){
ui->label_value1->setText("5"); //用5覆盖0
}else{
ui->label_value1->setText(ui->label_value1->text()+"5"); //后缀一个字符串“5”
}
}else if(empty==2){ //仍在输入value2
if(ui->label_value2->text().toInt()==0){
ui->label_value2->setText("5"); //用5覆盖0
}else{
ui->label_value2->setText(ui->label_value2->text()+"5"); //后缀一个字符串“5”
}
}
}
void MainWindow::onPushButton_6_Clicked(){
if(empty==1){ //仍在输入value1
if(ui->label_value1->text().toInt()==0){
ui->label_value1->setText("6"); //用6覆盖0
}else{
ui->label_value1->setText(ui->label_value1->text()+"6"); //后缀一个字符串“6”
}
}else if(empty==2){ //仍在输入value2
if(ui->label_value2->text().toInt()==0){
ui->label_value2->setText("6"); //用6覆盖0
}else{
ui->label_value2->setText(ui->label_value2->text()+"6"); //后缀一个字符串“6”
}
}
}
void MainWindow::onPushButton_7_Clicked(){
if(empty==1){ //仍在输入value1
if(ui->label_value1->text().toInt()==0){
ui->label_value1->setText("7"); //用7覆盖0
}else{
ui->label_value1->setText(ui->label_value1->text()+"7"); //后缀一个字符串“7”
}
}else if(empty==2){ //仍在输入value2
if(ui->label_value2->text().toInt()==0){
ui->label_value2->setText("7"); //用7覆盖0
}else{
ui->label_value2->setText(ui->label_value2->text()+"7"); //后缀一个字符串“7”
}
}
}
void MainWindow::onPushButton_8_Clicked(){
if(empty==1){ //仍在输入value1
if(ui->label_value1->text().toInt()==0){
ui->label_value1->setText("8"); //用8覆盖0
}else{
ui->label_value1->setText(ui->label_value1->text()+"8"); //后缀一个字符串“8”
}
}else if(empty==2){ //仍在输入value2
if(ui->label_value2->text().toInt()==0){
ui->label_value2->setText("8"); //用8覆盖0
}else{
ui->label_value2->setText(ui->label_value2->text()+"8"); //后缀一个字符串“8”
}
}
}
void MainWindow::onPushButton_9_Clicked(){
if(empty==1){ //仍在输入value1
if(ui->label_value1->text().toInt()==0){
ui->label_value1->setText("9"); //用9覆盖0
}else{
ui->label_value1->setText(ui->label_value1->text()+"9"); //后缀一个字符串“9”
}
}else if(empty==2){ //仍在输入value2
if(ui->label_value2->text().toInt()==0){
ui->label_value2->setText("9"); //用9覆盖0
}else{
ui->label_value2->setText(ui->label_value2->text()+"9"); //后缀一个字符串“9”
}
}
}
/*
加法按钮
*/
void MainWindow::onPushButton_add_Clicked(){
sign=1; //标记实现的是加法
empty=2; //该写入label_value2了
ui->label_sign->setText("+"); //改变UI上的符号
}
/*
减法按钮
*/
void MainWindow::onPushButton_sub_Clicked(){
sign=2; //标记实现的是减法
empty=2;
ui->label_sign->setText("-");
}
/*
乘法按钮
*/
void MainWindow::onPushButton_mul_Clicked(){
sign=3; //标记实现的是加法
empty=2;
ui->label_sign->setText("*");
}
/*
除法按钮
*/
void MainWindow::onPushButton_div_Clicked(){
sign=4; //标记实现的是加法
empty=2;
ui->label_sign->setText("÷");
}
/*
等号按钮
*/
void MainWindow::onPushButton_equ_Clicked(){
if(sign==1){ //加法
int result=ui->label_value1->text().toInt() + ui->label_value2->text().toInt();
ui->label_result->setText(QString::number(result));
}else if(sign==2){ //减法
int result=ui->label_value1->text().toInt() - ui->label_value2->text().toInt();
ui->label_result->setText(QString::number(result));
}else if(sign==3){ //乘法
int result=ui->label_value1->text().toInt() * ui->label_value2->text().toInt();
ui->label_result->setText(QString::number(result));
}else if(sign==4){ //除法
int result=ui->label_value1->text().toInt() / ui->label_value2->text().toInt();
ui->label_result->setText(QString::number(result));
}else{
return;
}
}
/*
清除按钮
*/
void MainWindow::onPushButton_clear_Clicked(){
empty = 1; //便于实现下一次运算!
sign = 0; //初始化
ui->label_sign->setText(" ");
ui->label_value1->setText("0");
ui->label_value2->setText("0");
ui->label_result->setText("0");
}
- mainwindow.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>600</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<widget class="QWidget" name="layoutWidget">
<property name="geometry">
<rect>
<x>80</x>
<y>90</y>
<width>430</width>
<height>331</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout" stretch="0,3">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="sizeConstraint">
<enum>QLayout::SetFixedSize</enum>
</property>
<item>
<widget class="QLabel" name="label_value1">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="styleSheet">
<string notr="true">background-color: rgb(255, 249, 180);
font: 22pt "Times New Roman";</string>
</property>
<property name="text">
<string>0</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_sign">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="styleSheet">
<string notr="true">font: 22pt "Times New Roman";</string>
</property>
<property name="text">
<string/>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_value2">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="styleSheet">
<string notr="true">background-color: rgb(255, 249, 180);
font: 22pt "Times New Roman";</string>
</property>
<property name="text">
<string>0</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_equ">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="styleSheet">
<string notr="true">font: 22pt "Times New Roman";</string>
</property>
<property name="text">
<string>=</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_result">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="styleSheet">
<string notr="true">background-color: rgb(255, 249, 180);
font: 22pt "Times New Roman";</string>
</property>
<property name="text">
<string>0</string>
</property>
<property name="textFormat">
<enum>Qt::MarkdownText</enum>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="margin">
<number>7</number>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="4" column="0">
<widget class="QPushButton" name="pushButton_1">
<property name="text">
<string>1</string>
</property>
</widget>
</item>
<item row="5" column="3">
<widget class="QPushButton" name="pushButton_div">
<property name="styleSheet">
<string notr="true">background-color: rgb(0, 170, 127);</string>
</property>
<property name="text">
<string>/</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QPushButton" name="pushButton_8">
<property name="text">
<string>8</string>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QPushButton" name="pushButton_add">
<property name="styleSheet">
<string notr="true">background-color: rgb(0, 170, 127);</string>
</property>
<property name="text">
<string>+</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QPushButton" name="pushButton_5">
<property name="text">
<string>5</string>
</property>
</widget>
</item>
<item row="5" column="2">
<widget class="QPushButton" name="pushButton_equ">
<property name="text">
<string>=</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QPushButton" name="pushButton_0">
<property name="text">
<string>0</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QPushButton" name="pushButton_4">
<property name="text">
<string>4</string>
</property>
</widget>
</item>
<item row="4" column="3">
<widget class="QPushButton" name="pushButton_mul">
<property name="styleSheet">
<string notr="true">background-color: rgb(0, 170, 127);</string>
</property>
<property name="text">
<string>*</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QPushButton" name="pushButton_clear">
<property name="text">
<string>C</string>
</property>
</widget>
</item>
<item row="4" column="2">
<widget class="QPushButton" name="pushButton_3">
<property name="text">
<string>3</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QPushButton" name="pushButton_9">
<property name="text">
<string>9</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QPushButton" name="pushButton_7">
<property name="text">
<string>7</string>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QPushButton" name="pushButton_sub">
<property name="styleSheet">
<string notr="true">background-color: rgb(0, 170, 127);</string>
</property>
<property name="text">
<string>-</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QPushButton" name="pushButton_2">
<property name="text">
<string>2</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QPushButton" name="pushButton_6">
<property name="text">
<string>6</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>26</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>
- 最后的成果非常丑就是了
四、思考
- 没法用String定义字符串,要用QString s这样定义。(不是C++吗?why不能用String?)
- 重要的函数
(1)用QString::number(“1234”)这个函数将数字转为字符串
(2)用toIn()函数将字符串转为int型变量 - 槽函数写好了,信号也连上槽了,但是点击button总是没有反应。用以下代码作为测试,在程序输出窗口里也识别不到点了哪个按钮:
QObject *obj = sender(); //获取发送者
qDebug(QPrintable(obj->objectName())); //打印发送者
你猜是为什么??SLOT里的函数名写错了。。。
名字都错了为什么能编译通过运行呢?真狗!在程序输出栏里才提示No such slot。艹!
- 修改了ui的控件名字后(将label_1修改为label_value1),mainwindow.cpp不认识label_value1。
改完 ui 以后记住要点击左下角的小锤子构建一下就好了。 - connect那里可以用循环来写,for里面改成i<=9就可以了
- 槽函数不需要向我一样一个按钮写一个,可以写在一整个函数里