最近在修改一個軟件的過程中,把Qt控件進行了重寫,重寫之后,布局更加簡單、合理,如此使得出現bug的概率降低。
實現的功能
1、將零散的小控件打包成一個模塊,進行整模塊的添加。
2、實現每個模塊的單獨刪除。
3、實現數值、功能的交互功能。如按鈕等。
代碼內容
話不多說,直接上代碼。因為是順手寫的,注釋不多,自己領會吧,工程文件放在文末。
mainwindow.h
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <testform.h> #include <QDebug> #include <QMessageBox>
namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = nullptr); ~MainWindow(); QGridLayout *m_gLayout; QList<testForm *>mtestForms; int count; void delete_Layout(); private slots: void on_add_btn_clicked(); void mdel_btn_clicked(); private: Ui::MainWindow *ui; signals: void add_info(int num); }; #endif // MAINWINDOW_H
mainwindow.cpp
1 #include "mainwindow.h"
2 #include "ui_mainwindow.h"
3
4 MainWindow::MainWindow(QWidget *parent) : 5 QMainWindow(parent), 6 ui(new Ui::MainWindow) 7 { 8 ui->setupUi(this); 9 m_gLayout=new QGridLayout; 10 ui->widget->setLayout(m_gLayout); 11 count=0; 12 } 13
14 MainWindow::~MainWindow() 15 { 16 delete ui; 17 } 18
19 void MainWindow::on_add_btn_clicked() 20 { 21 if(ui->lineEdit->text()!=""){ 22 count=mtestForms.size(); 23 testForm *mtestForm=new testForm(); 24 mtestForms.append(mtestForm); 25 mtestForm->setEdit(ui->lineEdit->text()); 26 connect(mtestForm,SIGNAL(mdel()),this,SLOT(mdel_btn_clicked())); 27 m_gLayout->addWidget(mtestForm); 28 }else{ 29 QMessageBox::information(this,"warming","請輸入類別"); 30 } 31 } 32
33 void MainWindow::mdel_btn_clicked() 34 { 35 testForm *tf = qobject_cast<testForm *>(sender()); //這一步能夠判斷你點擊的是哪一個控件
36 m_gLayout->removeWidget(tf); 37 tf->deleteLater(); 38 }
testfom.h
1 #ifndef TESTFORM_H 2 #define TESTFORM_H
3 #include <QWidget>
4 #include <QGroupBox>
5 #include <QHBoxLayout>
6 #include <QLabel>
7 #include <QLineEdit>
8 #include <QPushButton>
9 #include <QTimer>
10 #include <QDebug>
11 class testForm:public QWidget 12 { 13 Q_OBJECT 14 public: 15 testForm(); 16 QPushButton *m_btn_start; 17 QPushButton *m_btn_delete; 18 QLabel *m_label_Name; 19 QLabel *m_label_Count; 20 QLineEdit *m_lineEidt; 21 QHBoxLayout *m_hlayoutLabel; 22 QTimer *ask_COM_Timer; 23 void setEdit(QString type); 24 int count; 25
26 private slots: 27 void del_btn_click(); 28 void startTimer(); 29 void printcount(); 30
31 signals: 32 void mdel(); 33 }; 34
35 #endif // TESTFORM_H
testfom.cpp
1 #include "testform.h"
2
3 testForm::testForm() 4 { 5 m_btn_start=new QPushButton(); 6 connect(m_btn_start,SIGNAL(clicked()),this,SLOT(startTimer())); 7 m_btn_start->setText("啟動"); 8 m_btn_delete=new QPushButton(); 9 connect(m_btn_delete,SIGNAL(clicked()),this,SLOT(del_btn_click())); 10 m_btn_delete->setText("刪除"); 11 ask_COM_Timer=new QTimer(this); 12 ask_COM_Timer->setInterval(1000); 13 connect(ask_COM_Timer,SIGNAL(timeout()),this,SLOT(printcount())); 14 m_label_Name=new QLabel(); 15 m_label_Count=new QLabel(); 16 m_lineEidt=new QLineEdit(); 17 m_hlayoutLabel=new QHBoxLayout; 18 m_hlayoutLabel->addWidget(m_btn_start,0,nullptr); 19 m_hlayoutLabel->addWidget(m_lineEidt,1,nullptr); 20 m_hlayoutLabel->addWidget(m_label_Name,2,nullptr); 21 m_hlayoutLabel->addWidget(m_label_Count,3,nullptr); 22 m_hlayoutLabel->addStretch(4); 23 m_hlayoutLabel->addWidget(m_btn_delete,5,nullptr); 24
25 this->setLayout(m_hlayoutLabel); 26 QSizePolicy policy = this->sizePolicy(); 27 policy.setHorizontalPolicy(QSizePolicy::Preferred); 28 policy.setVerticalPolicy(QSizePolicy::Fixed); 29 this->setSizePolicy(policy); 30 } 31
32 void testForm::del_btn_click() 33 { 34 emit mdel(); 35 } 36
37 void testForm::setEdit(QString type) 38 { 39 m_lineEidt->setText(type); 40 m_label_Name->setText(type); 41 } 42
43 void testForm::startTimer() 44 { 45 count=0; 46 if(m_btn_start->text()=="啟動"){ 47 ask_COM_Timer->start(); 48 m_btn_start->setText("停止"); 49 }else if(m_btn_start->text()=="停止"){ 50 ask_COM_Timer->stop(); 51 m_btn_start->setText("啟動"); 52 } 53 } 54
55 void testForm::printcount(){ 56 qDebug()<<m_lineEidt->text()+" "+QString::number(count); 57 m_label_Count->setText(QString::number(count)); 58 count++; 59 }