總體框架包括兩個部分,一部分是UI界面框架,好比一級二級導航菜單按鈕總體佈局等,一部分是項目框架,上一篇文章說的是項目框架,這一篇文章來講界面框架,Qt作界面很是快速和高效,尤爲是提供了可視化的界面設計,所見即所得,和大部分的開發環境相似,好比宇宙第一的VS,古老的VB,當年超級牛逼的dephi等,都是提供了可視化的所見即所得界面設計器,拖拖控件搞定,而後再去寫對應的事件代碼,最後編譯打包發佈。前端
Qt基本上是超大型一站式GUI超市框架,你要的各類控件都有,好比按鈕、標籤、文本框、下拉框、進度條等,應有盡有,就算沒有的也能夠自定義控件來實現,做爲一個牛逼的GUI界面框架,要學好仍是須要花一丟丟時間的,沒有誰是一蹴而就的,作界面核心就兩點:佈局加配色,通常來講這是美工乾的活,可是縱觀國內大部分的程序員所在的公司,基本上沒有美工,很可憐,須要程序員一我的全包全部的,從需求分析到詳細設計到代碼編寫到界面設計到售後維護等。mysql
Qt的佈局提供了橫向佈局、垂直佈局、表格佈局、柵格佈局,主要就這四種,學會了這幾種佈局其實還不夠的,不少初學者會發現,達不到想要的效果,其實還要配合兩個牛逼的東西,那就是控件自己的拉伸策略sizePolicy加上彈簧spacer,其中拉伸策略包括了四個要素,水平策略、垂直策略、水平伸展、垂直伸展。在一個完整的帶界面的項目中,確定須要用上這幾個東西才能作出賞心悅目的界面。linux
Qt的配色當屬QSS無敵了,這個東西聽說是CSS2的子集,理論上包含了CSS2的全部寫法,不過目前CSS3大行其道,QSS還不支持CSS3,估計要重寫QSS解析器才行,代碼量應該巨大,可能官方目前主推qml,將來估計也沒有這個打算更新QSS使其支持CSS3,若是有一天支持CSS3了,那效果絕對宇宙第一了。我開源過3套QSS皮膚樣式。c++
皮膚地址:https://gitee.com/feiyangqingyun/QWidgetDemo https://github.com/feiyangqingyun/QWidgetDemo 文件名稱:styledemogit
體驗地址:https://gitee.com/feiyangqingyun/QWidgetExe https://github.com/feiyangqingyun/QWidgetExe
文件名稱:bin_sams.zip程序員
#include "frmview.h" #include "ui_frmview.h" #include "quiwidget.h" #include "dbhelper.h" #include "iconfont.h" #include "deviceserver.h" #include "devicehelper.h" #include "alarmlink.h" #include "soundapi.h" #include "deviceserver.h" #include "frmviewdevice.h" #include "frmviewmap.h" #include "frmviewdata.h" #include "frmviewplot.h" #include "frmdevicecontrol.h" frmView::frmView(QWidget *parent) : QWidget(parent), ui(new Ui::frmView) { ui->setupUi(this); this->initForm(); this->initControl(); QTimer::singleShot(1000, this, SLOT(initServer())); } frmView::~frmView() { delete ui; } void frmView::initForm() { ui->navTitleTable->setText("警情消息"); ui->navTitleTable->setLeftIcon(0xf108); ui->navTitleTable->setRightIcon4(0xf1f7); ui->navTitleTable->setRightIcon5(0xf1f8); ui->navTitleTree->setText("設備列表"); ui->navTitleTree->setLeftIcon(0xf0e8); ui->navTitleTree->setRightIcon5(0xf021); ui->navTitleList->setText("地圖列表"); ui->navTitleList->setLeftIcon(0xf0e8); ui->navTitleList->setRightIcon5(0xf021); ui->widgetLeft->setFixedWidth(App::LeftWidth); ui->widgetRight->setFixedWidth(App::RightWidth); connect(ui->navTitleTable, SIGNAL(mousePressed(int)), this, SLOT(mousePressed(int))); connect(AppEvent::Instance(), SIGNAL(doubleClicked(ButtonDefence *)), this, SLOT(doubleClicked(ButtonDefence *))); frmViewDevice *viewDevice = new frmViewDevice; ui->stackedWidget->addWidget(viewDevice); frmViewMap *viewMap = new frmViewMap; ui->stackedWidget->addWidget(viewMap); frmViewData *viewData = new frmViewData; ui->stackedWidget->addWidget(viewData); frmViewPlot *viewPlot = new frmViewPlot; ui->stackedWidget->addWidget(viewPlot); connect(this, SIGNAL(itemClicked(QString)), viewDevice, SLOT(itemClicked(QString))); connect(DeviceServer::Instance(), SIGNAL(receiveAlarm(QString, QString, quint8)), this, SLOT(receiveAlarm(QString, QString, quint8))); DeviceHelper::setTableData(viewData->getTable()); DeviceHelper::setTableWidget(ui->tableWidget); DeviceHelper::setTreeWidget(ui->treeWidget); DeviceHelper::setListWidget(ui->listWidget); DeviceHelper::setPanelWidget(viewDevice->getPanleWidget()); DeviceHelper::setLabel(viewMap->getLabel()); } void frmView::initTree() { DeviceHelper::initDeviceTree(); DeviceHelper::initDeviceStyle(); } void frmView::initControl() { DeviceHelper::initDeviceData(); DeviceHelper::initDeviceTable(); DeviceHelper::initDeviceTree(); DeviceHelper::initDeviceMap(); DeviceHelper::initDevicePanel(); DeviceHelper::initDeviceButton(); if (ui->listWidget->count() > 0) { ui->listWidget->setCurrentRow(0); on_listWidget_pressed(); } } void frmView::initServer() { //啓動設備解析 DeviceServer::Instance()->init(); DeviceServer::Instance()->start(); } void frmView::mousePressed(int index) { if (index == 5) { //改變聲音圖標並中止報警聲音 ui->navTitleTable->setRightIcon4(0xf1f7); SoundAPI::Instance()->stop(); if (App::WorkMode == 0) { AlarmLink::Instance()->reset(); } } else if (index == 6) { //清空臨時消息 DeviceHelper::clearMsg(); } } void frmView::doubleClicked(ButtonDefence *btn) { if (App::CurrentUserType.contains("管理員")) { if (btn->getButtonStatus() == ButtonDefence::ButtonStatus_Error) { //雙擊重連當前端口下的全部設備 QString portName = DBHelper::getPortName(btn->property("deviceName").toString()); DeviceServer::Instance()->readValue(portName, 255, true); } else { //彈出詳細信息 QString positionID = btn->property("positionID").toString(); frmDeviceControl::Instance()->setPositionID(positionID); frmDeviceControl::Instance()->show(); } } } void frmView::on_listWidget_pressed() { int row = ui->listWidget->currentRow(); if (row < 0) { return; } DeviceHelper::initDeviceMapCurrent(DBData::MapNames.at(row)); } void frmView::on_treeWidget_itemPressed(QTreeWidgetItem *item, int column) { if (item->parent() != 0) { emit itemClicked(item->text(column)); } } void frmView::setIndex(int index) { ui->stackedWidget->setCurrentIndex(index); bool visible = (index == 0 || index == 2); ui->widgetLeft->setVisible(!(index == 3)); ui->widgetRight->setVisible(!(index == 3)); ui->navTitleTree->setVisible(visible); ui->treeWidget->setVisible(visible); ui->navTitleList->setVisible(!visible); ui->listWidget->setVisible(!visible); } void frmView::receiveAlarm(const QString &deviceName, const QString &positionID, quint8 alarmType) { if (alarmType == 0 || alarmType == 2) { ui->navTitleTable->setRightIcon4(0xf0a2); } else { ui->navTitleTable->setRightIcon4(0xf1f7); } }