QT中的namespace Ui的理解

QT中的namespace Ui的理解

houxiaoliwang 2017-08-18 09:45:56  1379  已收藏 3

分类专栏: QT

接下来谈谈namespace Ui
                    { 
                        class Dialog: public Ui_Dialog {}; 
                    }

/********************************************/
                           dialog.h
/********************************************/
#ifndef DIALOG_H 
#define DIALOG_H 

#include <QtGui/QDialog> 

namespace Ui 

class Dialog; 


class Dialog : public QDialog 

Q_OBJECT 

public: 
Dialog(QWidget *parent = 0); 
~Dialog(); 

private: 
Ui::Dialog *ui; 
}; 

#endif // DIALOG_H 
/*********************************************/
                            ui_dialog.h
/*****************************************************************************/
/******************************************************************************** 
** Form generated from reading ui file 'dialog.ui' 
** 
** Created: Thu May 14 22:52:58 2009 
** by: Qt User Interface Compiler version 4.5.0 
** 
** WARNING! All changes made in this file will be lost when recompiling ui file! 
********************************************************************************/ 

#ifndef UI_DIALOG_H 
#define UI_DIALOG_H 

#include <QtCore/QVariant> 
#include <QtGui/QAction> 
#include <QtGui/QApplication> 
#include <QtGui/QButtonGroup> 
#include <QtGui/QDialog> 
#include <QtGui/QHeaderView> 
#include <QtGui/QListView> 
#include <QtGui/QPushButton> 

QT_BEGIN_NAMESPACE 

class Ui_Dialog 

public: 
QListView *listView; 
QPushButton *pushButton
 

void setupUi(QDialog *Dialog) 

if (Dialog->objectName().isEmpty()) 
Dialog->setObjectName(QString::fromUtf8("Dialog")); 
Dialog->resize(600, 400); 
listView = new QListView(Dialog); 
listView->setObjectName(QString::fromUtf8("listView")); 
listView->setGeometry(QRect(30, 10, 256, 192)); 
pushButton = new QPushButton(Dialog); 
pushButton->setObjectName(QString::fromUtf8("pushButton")); 
pushButton->setGeometry(QRect(140, 280, 75, 23)); 

retranslateUi(Dialog); 

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

void retranslateUi(QDialog *Dialog) 

Dialog->setWindowTitle(QApplication::translate("Dialog", "Dialog", 0, QApplication::UnicodeUTF8)); 
pushButton->setText(QApplication::translate("Dialog", "bye", 0, QApplication::UnicodeUTF8)); 
Q_UNUSED(Dialog); 
} // retranslateUi 

}; 

namespace Ui { 
class Dialog: public Ui_Dialog {}; 
} // namespace Ui 

QT_END_NAMESPACE 

#endif // UI_DIALOG_H 
/*******************************************************************************/
                        
                               dialog.cpp
/*******************************************************************************/
#include "dialog.h" 
#include "ui_dialog.h" 

Dialog::Dialog(QWidget *parent) 
: QDialog(parent), ui(new Ui::Dialog) 

ui->setupUi(this); 
//QObject::connect(ui->pushButton, SIGNAL(clicked()),this, SLOT(quit())); 


Dialog::~Dialog() 

delete ui; 
}
/********************************************************************************/

ui_dialog.h

代码中有很多被硬编码的地方:
listView->setGeometry(QRect(30, 10, 256, 192)); 
pushButton = new QPushButton(Dialog); 
pushButton->setObjectName(QString::fromUtf8("pushButton")); 
pushButton->setGeometry(QRect(140, 280, 75, 23)); 

designer生成的这个东西, 如何让程序的其他代码去使用呢?

最直接的, 它应该产生一个:
class Ui_Dialog {
QListView *listView; 
QPushButton *pushButton;
};

这样的类去让其他代码使用:

// My.h
#include "ui_dialog.h"
class My
        {
            Ui_Dialog dlg;
        };


// My.cpp
#include "My.h"
// 实现My

但是这样存在问题, 如果ui_dialog.h文件的内容被改变, 不但My.cpp会被重新编译,
所有包含My.h的文件也都会被重新编译。
而且这确实是一个问题: designer确实经常被拖来拖去。


如果产生ui_dialog.h的那个程序能将如下代码:
listView->setGeometry(QRect(30, 10, 256, 192)); 
pushButton = new QPushButton(Dialog); 
pushButton->setObjectName(QString::fromUtf8("pushButton")); 
pushButton->setGeometry(QRect(140, 280, 75, 23)); 

移动到一个ui_dialog.cpp 中, 至少在移动dlg上的那些界面元素时,  只会重新编译ui_dialog.cpp。
不会修改ui_dialog.h, 也就不会引发另一连串重编译。

但是, 除了将界面元素拖来拖去, designer还经常干的一些事就是添加,删除一些界面元素,如:
class Ui_Dialog 

public: 
QListView *listView; 
QPushButton *pushButton;
// ...
};

这样 ui_dialog.h 文件还是得改变。
如何让designer改变GUI外观后, 不会引发工程大范围的重新编译?

所以designer使用了pimpl手法 ……

前置声明一个 Ui:: Dialog类
namespace Ui  


      class Dialog; 


class Dialog : public QDialog  


      Ui:: Dialog *ui;  // 使用该类的一个指针
}; 

然后用户使用 dialog.h 头文件以及 Dialog类。
该文件被修改的频率就会低很多很多。
无论是将designer上的界面元素拖来拖去, 还是添加删除, dialog.h文件的内容——Dialog类的定义——都不会改变。

然后用户可以使用这个Dialog了:

#include "dialog.h"
class My 
{
    Dialog dlg;
};

 

 

Ui 创建两种不同的方式:
1. 在qt4中使用了继承的方式来使用designer创建的窗体,也就是同时继承QDialog和UI_Dialog。

 

2. 而在Qt Creator自动创建的项目中,使用了组合的方式来使用Designer创建的窗体,就是集成QDialog,

而将UI_Dialog作为一个成员变量来使用,也就是
private:
Ui::Dialog *ui;

 


区别:

在前一种方式中,你可以在继承类中直接使用UI_Dialog上的组件。

在后一种方式中,你要使用ui->XXX的方式使用UI_Dialog上的组件。

两种方式都可以,但个人感觉第二种好一些,毕竟组合比集成的耦合度来的弱一些,就是稍有点麻烦,要加ui->,但同时也带来了更清晰的代码结构

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1、首先,先创建一个新文件,并在里面添加新的Qt设计界面 可以得到如图,mainwindow是主界面,widget是我新添加的子界面 2、注意将子界面的.h文件添加主界面的.h 3、在主界面的.h,添加子界面的变量及打开子界面和处理子界面信号的函数(在主ui创建按钮) 4、在子界面.h文件,添加打开主界面函数和信号(在子ui创建按钮) 5、在主界面.cpp连接信号和槽,及对应函数 6、在子界面.cpp,写相关函数和信号 最终结果: 主界面和子界面间,通过按钮进行相互切换~ 下面附上源码: Mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include "widget.h" QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: void on_pushButton_clicked(); void dealslot(); private: Ui::MainWindow *ui; widget wid; }; #endif // MAINWINDOW_H Widget.h #ifndef WIDGET_H #define WIDGET_H #include <QWidget> namespace Ui { class widget; } class widget : public QWidget { Q_OBJECT public: explicit widget(QWidget *parent = nullptr); ~widget(); private slots: void on_pushButton_clicked(); signals: void ChangeUiSlot(); private: Ui::widget *ui; }; #endif // WIDGET_H Mainwindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include "widget.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); //connect(&wid,SIGNAL(ChangeUiSlot()),this,SLOT(dealslot())); connect(&wid,&widget::ChangeUiSlot,this,&MainWindow::dealslot); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_pushButton_clicked() { this->hide(); wid.show(); } void MainWindow::dealslot() { this->show(); wid.hide(); } Widget.cpp #include "widget.h" #include "ui_widget.h" widget::widget(QWidget *parent) : QWidget(parent), ui(new Ui::widget) { ui->setupUi(this); } widget::~widget() { delete ui; } void widget::on_pushButton_clicked() { emit ChangeUiSlot(); } Main.cpp #include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }
Qt Creator 多线程读取文件到程序显示 利用QT Creator多任务读取一个文档到程序里 为了防止直接读取文件里的内容太大而发生卡顿,于是多线程读取将更高效的解决这个问题。 效果图如下: 其pro文件无需改动,默认就好,头文件h里面的内容为 #ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include #include QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MyObj; class MyObj : public QObject { Q_OBJECT public: MyObj(); //新的线程 signals: void toLine(QString line); private slots: void doWork(); }; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: void appendText(QString); //定义一个槽 private: Ui::MainWindow *ui; QThread *t; MyObj *obj; }; #endif // MAINWINDOW_H 而MAIN主文件的内容为了防止文乱码做了如下修改: #include "mainwindow.h" #include #include int main(int argc, char *argv[]) { QApplication a(argc, argv); //设置文字体 防止乱码 a.setFont(QFont("Microsoft Yahei", 9)); //设置文编码 #if (QT_VERSION <= QT_VERSION_CHECK(5,0,0)) #if _MSC_VER QTextCodec *codec = QTextCodec::codecForName("GBK"); #else QTextCodec *codec = QTextCodec::codecForName("UTF-8"); #endif QTextCodec::setCodecForLocale(codec); QTextCodec::setCodecForCStrings(codec); QTextCodec::setCodecForTr(codec); #else QTextCodec *codec = QTextCodec::codecForName("UTF-8"); QTextCodec::setCodecForLocale(codec); #endif MainWindow w; w.show(); return a.exec(); } 接下来重点来了,源文件CPP里为 #include "mainwindow.h" #include "ui_mainwindow.h" #include #include #include #include #include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); t = new QThread(); //QThread obj = new MyObj(); obj->moveToThread(t); qDebug()<<"main thread:"<<QThread::currentThread(); connect(t,SIGNAL(started()), obj, SLOT(doWork())); connect(obj,SIGNAL
根据项目需求,需要在Qt进行绘图显示我们的数据。这时候,我们就用到了Qt在5.0之后新增的自带QChart控件,不再需要我们自己再去添加第三方库。下面是详细的介绍~ 在.pro文件 QT += charts 在.h文件 //QChart #include <QtCharts> using namespace QtCharts; //定时器 #include <QTimer> private slots: void updata_plot(); void on_pushButton_clicked(); void on_pushButton_2_clicked(); private: //绘图定时器 QTimer *timer_plot; //曲线 QSplineSeries* line; //曲线点的最大数量 int line_max = 100; //绘图变量和坐标 QChart* chart; QValueAxis *axisX; QValueAxis *axisY; 在.cpp文件 //将变量实例化 timer_plot = new QTimer(this); connect(timer_plot,SIGNAL(timeout()),this,SLOT(updata_plot())); line = new QSplineSeries(this); chart = new QChart(); chart->addSeries(line); axisX = new QValueAxis(this); axisY = new QValueAxis(this); //图像更新函数 void MainWindow::updata_plot() { QVector<QPointF> list; QVector<QPointF> newlist; list = line->pointsVector();//获取现在图列表 if (list.size() < line_max) { //保持原来 newlist = list; } else { //错位移动 for(int i =1 ; i< list.size();i++) { newlist.append(QPointF(i-1,list.at(i).y())); } } newlist.append(QPointF(newlist.size(),rand()));//最后补上新的数据 line->replace(newlist);//替换更新 line->setName("pressure");//设置曲线名称 line->setPen(QColor(255, 0, 0));//设置曲线颜色 line->setUseOpenGL(true);//openGl 加速 chart->setTitle("Pressure Data");//设置图标标题 chart->removeSeries(line); chart->addSeries(line); chart->createDefaultAxes();//设置坐标轴 // axisX->setRange(0,line_max);//范围 // axisX->setTitleText("times(secs)");//标题 // axisX->setTickCount(10);//分隔个数 // axisX->setLineVisible(true);//可视化 // axisX->setLinePenColor(Qt::blue);//颜色 // axisY->setRange(-200,1200); // axisY->setTitleText("value"); // axisY->setTickCount(6); // axisY->setLineVisible(true); // axisY->setLinePenColor(Qt::blue); // chart->setAxisX(axisX,line); // chart->setAxisY(axisY,line); ui->widget_plot->setChart(chart); } void MainWindow::on_pushButton_clicked() { timer_plot->start(50);//启动定时器 } void MainWindow::on_pushButton_2_clicked() { timer_plot->stop();//关闭定时器 } 在.ui文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_20312079

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值