国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
Qt自定義控件
編寫(xiě)Qt Designer自定義控件(一)——如何創(chuàng)建并使用Qt自定義控件
http://blog.csdn.net/giselite/article/details/12622429
編寫(xiě)Qt Designer自定義控件(二)——編寫(xiě)自定義控件界面
http://blog.csdn.net/giselite/article/details/12622561
編寫(xiě)Qt Designer自定義控件(三)——給自定義控件添加屬性
http://blog.csdn.net/giselite/article/details/12622625
編寫(xiě)Qt Designer自定義控件(四)——使用自定義控件
http://blog.csdn.net/giselite/article/details/12622659
編寫(xiě)Qt Designer自定義控件(一)——如何創(chuàng)建并使用Qt自定義控件
原創(chuàng) 2013年10月11日 19:26:16
在使用Qt Designer設(shè)計(jì)窗體界面時(shí),我們可以使用Widget Box里的窗體控件非常方便的繪制界面,比如拖進(jìn)去一個(gè)按鈕,一個(gè)文本編輯器等。雖然Qt Designer里的控件可以滿足我們大部分的需求,但是有時(shí)候,也會(huì)產(chǎn)生一些特殊的需要,比如一個(gè)輸入框,我們要輸入的是經(jīng)緯度,此時(shí)就會(huì)有兩種輸入方式,一種是小數(shù)形式,一種是度分秒的形式,此時(shí)只使用一個(gè)簡(jiǎn)單的LineEdit是無(wú)法滿足需求的。我們?cè)O(shè)想構(gòu)造這樣一個(gè)輸入控件,它可以支持浮點(diǎn)數(shù)輸入,同時(shí)它還具有一個(gè)屬性,更改這個(gè)屬性可以使其切換為經(jīng)緯度輸入形式。如果我們的多個(gè)窗體上都需要輸入經(jīng)緯度,那么構(gòu)造這樣一個(gè)控件,將會(huì)非常方便。下面就以此為例,講解一下如何創(chuàng)建自定義的窗體控件。
第一步:創(chuàng)建QtDesigner自定義控件工程
打開(kāi)Qt Creator,創(chuàng)建一個(gè)Qt 設(shè)計(jì)師自定義控件,如下圖所示:
根據(jù)向?qū)崾荆瑒?chuàng)建好工程,這里取名為L(zhǎng)ogLatEdit,工程目錄如下圖所示:
第二步:編譯控件工程
為了淌通整個(gè)自定義控件的編寫(xiě)流程,我們先不做任何更改,切換為Release版本,直接編譯一下。
第三步:部署插件
編譯完成后,在輸出目錄下,將生成的dll文件和lib文件一起拷貝到Qt的插件目錄下,以我使用的Qt 4.8.4為例,在Qt 4.8.4的安裝目錄D:\Qt\4.8.4下,找到plugins目錄,在其中找到designer目錄,然后把dll和lib放進(jìn)去,完整路徑為:D:\Qt\4.8.4\plugins\designer。之后,啟動(dòng)D:\Qt\4.8.4\bin下的designer.exe,創(chuàng)建一個(gè)窗體,此時(shí)就會(huì)發(fā)現(xiàn)在左側(cè)的Widget Box里出現(xiàn)了我們自己的LogLatEdit控件,我們可以像使用其它控件一樣,把我們自己的控件拖繪到窗體上,如下圖所示:
如果自定義控件沒(méi)有出現(xiàn)在Widgetbox里,那么此時(shí)你可以通過(guò)【幫助-關(guān)于插件】菜單,打開(kāi)插件信息對(duì)話框,點(diǎn)擊刷新按鈕,只要你沒(méi)有忘記把dll和lib文件拷貝到正確的位置,插件都會(huì)自動(dòng)識(shí)別并加載。對(duì)于其它版本的Qt也一樣,比如我自己的電腦里安裝了好幾個(gè)版本的Qt,對(duì)于其它版本的Qt,做法也是一樣,只需要把插件工程生成的dll和lib文件放置到相應(yīng)版本的插件目錄下去即可。
到此,我們就理清了如何創(chuàng)建一個(gè)自定義控件,并且知道了如何部署、加載并使用自定義控件。下面我們開(kāi)始編寫(xiě)我們需要的控件,對(duì)于只想了解自定義控件開(kāi)發(fā)過(guò)程的讀者,至此就已經(jīng)知道如何做了,那么后面的內(nèi)容您可以略過(guò)不讀了。
編寫(xiě)Qt Designer自定義控件(二)——編寫(xiě)自定義控件界面
原創(chuàng) 2013年10月11日 19:39:28
接上文:編寫(xiě)Qt Designer自定義控件(一)——如何創(chuàng)建并使用Qt自定義控件
既然是控件,就應(yīng)該有界面,默認(rèn)生成的控件類(lèi)只是一個(gè)繼承了QWidget的類(lèi),如下:
[cpp] view plain copy
#ifndef LOGLATEDIT_H
#define LOGLATEDIT_H
#include <QWidget>
class LogLatEdit : public QWidget
{
Q_OBJECT
public:
LogLatEdit(QWidget *parent = 0);
};
#endif
我們需要的是如下的控件組合:
該控件在輸入浮點(diǎn)型模式下,是上面那樣,直接輸入以度為單位的浮點(diǎn)數(shù)即可,如果經(jīng)緯度信息不是以度為單位的,此時(shí)自己換算的話非常麻煩,因此可以切換為度分秒的輸入模式,也就是下面哪種樣子。為此,我們需要添加一個(gè)LineEidt,兩個(gè)SpinBox和一個(gè)DoubleSpinBox以及一些Label控件。
為了簡(jiǎn)單起見(jiàn),我不想自己手動(dòng)去寫(xiě)這些界面相關(guān)的代碼,為此我們可以先刪掉默認(rèn)生成的loglatedit.h和loglatedit.cpp文件,這樣我們就可以重新使用LogLatEdit這個(gè)名稱(chēng)重新新建一個(gè)ui類(lèi)了。右鍵工程,選擇“添加新文件”,使用Qt下的“Qt設(shè)計(jì)師界面類(lèi)”模板,創(chuàng)建一個(gè)ui類(lèi),如下圖所示:
這個(gè)界面類(lèi),我們重新命名為我們需要的控件名稱(chēng)LogLatEdit,之后編輯ui文件,調(diào)整QWidget的大小,然后繪制控件,如圖:
這里使用了HorizontalLayout控件對(duì)控件組合進(jìn)行分組,為了演示方便,此處將二者拖放開(kāi)來(lái),最終的控件,實(shí)際上是兩個(gè)水平布局疊加在一起,每次只有一個(gè)控件組合可見(jiàn)。
當(dāng)然另一個(gè)做法也是可行的,那就是不要?jiǎng)h除最初默認(rèn)生成的loglatedit文件,而是把這個(gè)新建的ui類(lèi)命名為別的名字,比如test,在繪制好控件之后,編譯一下,然后找到Moc生成的ui_test.h文件,打開(kāi)該文件,我們把相應(yīng)的代碼拷貝到我們的LogLatEdit控件類(lèi)中去,然后做適當(dāng)?shù)男薷?,比如設(shè)定兩個(gè)控件組合的位置及可見(jiàn)性,以及控件容器QWidget的大小等。這里為了把所有相關(guān)的代碼都放在一起,便于讀者測(cè)試,使用的就是這種方式。
使用ui類(lèi)的方式比較方便,所有與界面相關(guān)的處理都可以在窗體設(shè)計(jì)器中完成,并且界面與代碼分離,這種代碼管理模式邏輯清晰,便于管理。不過(guò)使用ui類(lèi)時(shí),如果我們的ui類(lèi)名稱(chēng)不是默認(rèn)的LogLatEdit,則需要修改一下插件類(lèi)中創(chuàng)建插件的代碼,主要是修改loglateditplugin.cpp文件里createWidget方法中返回的控件對(duì)象。
經(jīng)過(guò)修改之后我們的經(jīng)緯度控件的代碼如下:
[cpp] view plain copy
#ifndef LOGLATEDIT_H
#define LOGLATEDIT_H
#include <QWidget>
#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QDoubleSpinBox>
#include <QtGui/QHBoxLayout>
#include <QtGui/QHeaderView>
#include <QtGui/QLabel>
#include <QtGui/QLineEdit>
#include <QtGui/QSpacerItem>
#include <QtGui/QSpinBox>
#include <QtGui/QWidget>
class LogLatEdit : public QWidget
{
Q_OBJECT
public:
LogLatEdit(QWidget *parent = 0);
private:
QWidget *horizontalLayoutWidget;
QHBoxLayout *horizontalLayout;
QSpinBox *spinBox;
QLabel *label_7;
QSpinBox *spinBox_2;
QLabel *label_8;
QDoubleSpinBox *doubleSpinBox;
QLabel *label_9;
QWidget *horizontalLayoutWidget_2;
QHBoxLayout *horizontalLayout_2;
QLineEdit *lineEdit;
QLabel *label_6;
QSpacerItem *horizontalSpacer;
QSpacerItem *horizontalSpacer_2;
};
#endif
源文件:
[cpp] view plain copy
#include "loglatedit.h"
LogLatEdit::LogLatEdit(QWidget *parent) :
QWidget(parent)
{
this->resize(160, 22);
this->setMinimumSize(QSize(160,22)); //限定控件的大小
this->setMaximumSize(QSize(200,22));
horizontalLayoutWidget = new QWidget(this);
horizontalLayoutWidget->setObjectName(QString::fromUtf8("horizontalLayoutWidget"));
horizontalLayoutWidget->setGeometry(QRect(0, 0, 160, 22));
horizontalLayout = new QHBoxLayout(horizontalLayoutWidget);
horizontalLayout->setSpacing(1);
horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout"));
horizontalLayout->setContentsMargins(0, 0, 0, 0);
spinBox = new QSpinBox(horizontalLayoutWidget);
spinBox->setObjectName(QString::fromUtf8("spinBox"));
spinBox->setMinimumSize(QSize(35, 20));
spinBox->setMaximumSize(QSize(35, 20));
spinBox->setMaximum(90);
horizontalLayout->addWidget(spinBox);
label_7 = new QLabel(horizontalLayoutWidget);
label_7->setObjectName(QString::fromUtf8("label_7"));
QSizePolicy sizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred);
sizePolicy.setHorizontalStretch(0);
sizePolicy.setVerticalStretch(0);
sizePolicy.setHeightForWidth(label_7->sizePolicy().hasHeightForWidth());
label_7->setSizePolicy(sizePolicy);
label_7->setMinimumSize(QSize(3, 20));
label_7->setSizeIncrement(QSize(1, 0));
horizontalLayout->addWidget(label_7);
horizontalSpacer = new QSpacerItem(0, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
horizontalLayout->addItem(horizontalSpacer);
spinBox_2 = new QSpinBox(horizontalLayoutWidget);
spinBox_2->setObjectName(QString::fromUtf8("spinBox_2"));
spinBox_2->setMinimumSize(QSize(35, 20));
spinBox_2->setMaximumSize(QSize(35, 20));
spinBox_2->setMaximum(90);
horizontalLayout->addWidget(spinBox_2);
label_8 = new QLabel(horizontalLayoutWidget);
label_8->setObjectName(QString::fromUtf8("label_8"));
sizePolicy.setHeightForWidth(label_8->sizePolicy().hasHeightForWidth());
label_8->setSizePolicy(sizePolicy);
label_8->setMinimumSize(QSize(3, 20));
label_8->setSizeIncrement(QSize(1, 0));
horizontalLayout->addWidget(label_8);
horizontalSpacer_2 = new QSpacerItem(0, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
horizontalLayout->addItem(horizontalSpacer_2);
doubleSpinBox = new QDoubleSpinBox(horizontalLayoutWidget);
doubleSpinBox->setObjectName(QString::fromUtf8("doubleSpinBox"));
doubleSpinBox->setMinimumSize(QSize(66, 20));
doubleSpinBox->setMaximumSize(QSize(66, 20));
doubleSpinBox->setDecimals(4);
doubleSpinBox->setMaximum(90);
horizontalLayout->addWidget(doubleSpinBox);
label_9 = new QLabel(horizontalLayoutWidget);
label_9->setObjectName(QString::fromUtf8("label_9"));
sizePolicy.setHeightForWidth(label_9->sizePolicy().hasHeightForWidth());
label_9->setSizePolicy(sizePolicy);
label_9->setMinimumSize(QSize(3, 20));
label_9->setSizeIncrement(QSize(1, 0));
horizontalLayout->addWidget(label_9);
horizontalLayoutWidget_2 = new QWidget(this);
horizontalLayoutWidget_2->setObjectName(QString::fromUtf8("horizontalLayoutWidget_2"));
horizontalLayoutWidget_2->setGeometry(QRect(0, 0, 160, 22));
horizontalLayout_2 = new QHBoxLayout(horizontalLayoutWidget_2);
horizontalLayout_2->setSpacing(1);
horizontalLayout_2->setObjectName(QString::fromUtf8("horizontalLayout_2"));
horizontalLayout_2->setContentsMargins(0, 0, 0, 0);
lineEdit = new QLineEdit(horizontalLayoutWidget_2);
lineEdit->setObjectName(QString::fromUtf8("lineEdit"));
lineEdit->setInputMethodHints(Qt::ImhDigitsOnly|Qt::ImhFormattedNumbersOnly);
horizontalLayout_2->addWidget(lineEdit);
label_6 = new QLabel(horizontalLayoutWidget_2);
label_6->setObjectName(QString::fromUtf8("label_6"));
horizontalLayout_2->addWidget(label_6);
label_7->setText(QApplication::translate("LogLatEdit", "\302\260", 0, QApplication::UnicodeUTF8));
label_8->setText(QApplication::translate("LogLatEdit", "\342\200\262", 0, QApplication::UnicodeUTF8));
label_9->setText(QApplication::translate("LogLatEdit", "\342\200\263", 0, QApplication::UnicodeUTF8));
label_6->setText(QApplication::translate("LogLatEdit", "\302\260", 0, QApplication::UnicodeUTF8));
horizontalLayoutWidget_2->setVisible(false);
QMetaObject::connectSlotsByName(this);
}
至此,界面相關(guān)的事情就做完了,后面我們需要給這個(gè)控件添加兩個(gè)屬性,一個(gè)輸入模式屬性,更改這個(gè)屬性時(shí),我們的控件可以在兩種輸入模式下切換,另一個(gè)屬性就是經(jīng)緯度值,我們要使其可以設(shè)置和返回經(jīng)緯度值。
未完,待續(xù)...
編寫(xiě)Qt Designer自定義控件(三)——給自定義控件添加屬性
原創(chuàng) 2013年10月11日 19:45:03
接上文:編寫(xiě)Qt Designer自定義控件(二)——編寫(xiě)自定義控件界面
窗體控件都有屬性,比如QLineEdit就有text屬性,另外還有設(shè)置屬性,比如QLineEdit的readOnly屬性。下面就講解一下如何給自己的控件添加屬性的問(wèn)題。對(duì)于我們的經(jīng)緯度輸入控件,它應(yīng)該具有一個(gè)設(shè)置屬性和一個(gè)值屬性,我們把設(shè)置屬性命名為inputMode,把值屬性命名為value,先來(lái)講解設(shè)置屬性inputMode。
對(duì)于inputMode屬性,它應(yīng)該是一個(gè)枚舉值,分別對(duì)應(yīng)控件的兩種狀態(tài),即浮點(diǎn)輸入模式和經(jīng)緯度輸入模式,因此這個(gè)類(lèi)型應(yīng)該定義為枚舉型。另外對(duì)于Qt的控件類(lèi),如何聲明屬性,我們可以參考Qt的源代碼,比如D:\Qt\4.8.4\src\gui\widgets目錄下QMainWindow的定義,我們可以仿照其做法,實(shí)現(xiàn)輸入模式屬性,這里不多做解釋?zhuān)苯咏o出代碼:
[cpp] view plain copy
class LogLatEdit : public QWidget
{
Q_OBJECT
Q_ENUMS(InputMode)
Q_PROPERTY(InputMode inputMode READ inputMode WRITE setInputMode)
Q_PROPERTY(float value READ value WRITE setValue)
public:
LogLatEdit(QWidget *parent = 0);
enum InputMode
{
Float,      //float number mode
DegSecMin   //Degree second minute mode
};
InputMode inputMode()const;
void setInputMode(const InputMode mode);
double value() const;
void setValue(const double val);
//其余略
};
仿照QMainWindow的DockOptions屬性和iconSize屬性,我們實(shí)現(xiàn)我們的inputMode屬性和value屬性。這里注意一下使用Q_PROPERTY宏聲明屬性的方法,用法很簡(jiǎn)單,不多解釋。下面是對(duì)應(yīng)屬性的實(shí)現(xiàn)代碼:
[cpp] view plain copy
LogLatEdit::InputMode LogLatEdit::inputMode() const
{
return m_Mode;
}
void LogLatEdit::setInputMode(const InputMode mode)
{
double val = this->value();
if(mode==DegSecMin)
{
horizontalLayoutWidget->setVisible(true);
horizontalLayoutWidget_2->setVisible(false);
}
else
{
horizontalLayoutWidget->setVisible(false);
horizontalLayoutWidget_2->setVisible(true);
}
m_Mode = mode;
this->setValue(val);
}
double LogLatEdit::value() const
{
if(this->inputMode()==Float)
{
return this->lineEdit->text().toDouble();
}
else
{
double val = 0;
val = this->spinBox->value() +
double(this->spinBox_2->value())/60.0 +
this->doubleSpinBox->value()/3600.0;
return val;
}
}
void LogLatEdit::setValue(const double val)
{
m_Value = val;
if(this->inputMode()==Float)
{
this->lineEdit->setText(tr("%1").arg(val));
}
else
{
this->spinBox->setValue(int(val));
this->spinBox_2->setValue(int((val-int(val))*60));
this->doubleSpinBox->setValue(((val-int(val))*60-int((val-int(val))*60)));
}
}
未完,待續(xù)...
編寫(xiě)Qt Designer自定義控件(四)——使用自定義控件
原創(chuàng) 2013年10月11日 19:47:38
接上文:編寫(xiě)Qt Designer自定義控件(三)——給自定義控件添加屬性
控件編寫(xiě)完畢以后,把生成的dll和lib文件一起拷貝到Qt安裝目錄下的插件目錄里,比如我安裝在D盤(pán)里的Qt 4.8.4,路徑為:D:\Qt\4.8.4\plugins\designer,拷貝進(jìn)去以后,這個(gè)插件就可以被Qt Designer加載了,此時(shí)這個(gè)自定義控件就可以像普通的控件一樣使用了。當(dāng)然如有必要,還可以給這個(gè)控件添加一些信號(hào)和槽,另外按照經(jīng)緯度的取值范圍不同,做一下區(qū)分經(jīng)度和維度的處理,本例中不需要這么復(fù)雜,就不再深入探索了,下面是使用自定義的經(jīng)緯度輸入控件的效果:
到目前為止,我們已經(jīng)可以在Qt Designer中使用自定義的控件繪制界面了,但是這個(gè)時(shí)候,事情還沒(méi)有完,因?yàn)槭褂肣tCreator時(shí),會(huì)發(fā)現(xiàn)其界面設(shè)計(jì)器中并沒(méi)有我們的自定義控件。另外當(dāng)我們用Qt Designer繪制完控件后,編譯時(shí)會(huì)發(fā)生找不到“l(fā)oglatedit.h”頭文件的編譯錯(cuò)誤。這個(gè)問(wèn)題很容易理解,首先我們可以想到的是Qt Creator和Qt Designer的自定義控件目錄是不同的,我自己的機(jī)器里,Qt和Qt Creator的安裝目錄如下:
當(dāng)我把自定義控件的dll和lib文件拷貝到D:\Qt\4.8.4\plugins\designer目錄下,再啟動(dòng)D:\Qt\4.8.4\bin目錄下的designer.exe,這個(gè)插件可以加載到Widget Box里面去,但是如果我啟動(dòng)D:\Qt\qtcreator-2.8.1\bin目錄下的Qt Creator,我們的插件并不會(huì)出現(xiàn)在Qt Creator的設(shè)計(jì)器中。因此,對(duì)于Qt Creator,我們也需要執(zhí)行以下控件的安裝,那么具體要安裝到哪里去呢?經(jīng)過(guò)在Qt Creator安裝目錄下一番查找,發(fā)現(xiàn)D:\Qt\qtcreator-2.8.1\bin\plugins\designer這個(gè)目錄下存在和D:\Qt\4.8.4\plugins\designer目錄下同名的dll文件,于是我們猜測(cè)這個(gè)目錄就是Qt Creator的控件安裝目錄,接下來(lái)拷貝loglateditplugin.dll到這個(gè)目錄下,之后重新打開(kāi)Qt Creator,發(fā)現(xiàn)自定義控件加載成功了,于是第一個(gè)問(wèn)題解決了。
對(duì)于第二個(gè)問(wèn)題,我們很容易想到使用一個(gè)動(dòng)態(tài)庫(kù)時(shí),除了要有dll和lib文件外,還需要頭文件,而對(duì)于某一版本的Qt SDK,其界面相關(guān)的頭文件都放置在QtGui目錄下,于是我將工程中經(jīng)緯度輸入控件的頭文件loglatedit.h拷貝到D:\Qt\4.8.4\include\QtGui目錄下,再次試驗(yàn),發(fā)現(xiàn)編譯可以通過(guò),但是連接失敗,嘗試將相應(yīng)的lib文件放到D:\Qt\4.7.4\lib目錄下并且把該lib庫(kù)添加為工程的依賴(lài)庫(kù),依然連接失敗。這表明Qt的自定義控件工程并沒(méi)有導(dǎo)出我們的自定義控件,因此其生成的庫(kù)文件loglateditplugin.lib里并沒(méi)有自定義控件的信息。因此要使用自定義控件,只能引入源碼。
通過(guò)以上實(shí)驗(yàn),總結(jié)一下具體的做法,列舉如下:
1.        創(chuàng)建Qt 設(shè)計(jì)師自定義控件工程,編寫(xiě)自定義控件;
2.        拷貝release版的dll和lib文件到Qt Designer的插件目錄下,如D:\Qt\4.8.4\plugins\designer,這樣自定義控件即可在Qt Designer中使用;
3.        拷貝dll文件到Qt Creator的集成Qt Designer的插件目錄下,如:D:\Qt\qtcreator-2.8.1\bin\plugins\designer,使集成于Qt Creator中的Qt Designer可以加載并使用該控件;
4.        拷貝自定義控件的頭文件和源文件到使用自定義控件的工程中,并且添加到工程里面去,這樣就可以正確編譯并連接了;
參考:關(guān)于QT自定義控件(Custom Widget)相關(guān)知識(shí)總結(jié)
另可以參考下如下文章,同時(shí)以后轉(zhuǎn)載不要只保存網(wǎng)址,需要把整篇文章的內(nèi)容都轉(zhuǎn)過(guò)來(lái)才行。
http://qimo601.iteye.com/blog/1407257
Qt自定義窗口部件
QtDesigner自定義窗口部件有兩種方法:改進(jìn)法(promotion)和插件法(plugin)
改進(jìn)法
1、改進(jìn)法之前,要先寫(xiě)好子類(lèi)化QSpinBox后的HexspinBox.h和HexspinBox.cpp文件。把這兩個(gè)文件拷貝到想要的項(xiàng)目中。
HexspinBox.h
Cpp代碼  
#ifndef HEXSPINBOX_H
#define HEXSPINBOX_H
#include <QSpinBox>
class QRegExpValidator;
class HexSpinBox : public QSpinBox
{
Q_OBJECT
public:
HexSpinBox(QWidget *parent = 0);
protected:
QValidator::State validate(QString &text, int &pos) const;
int valueFromText(const QString &text) const;
QString textFromValue(int value) const;
private:
QRegExpValidator *validator;
};
#endif
HexspinBox.cpp
Cpp代碼  
#include <QtGui>
#include "hexspinbox.h"
HexSpinBox::HexSpinBox(QWidget *parent)
: QSpinBox(parent)
{
setRange(0, 255);
validator = new QRegExpValidator(QRegExp("[0-9A-Fa-f]{1,8}"), this);
}
QValidator::State HexSpinBox::validate(QString &text, int &pos) const
{
return validator->validate(text, pos);
}
int HexSpinBox::valueFromText(const QString &text) const
{
bool ok;
return text.toInt(&ok, 16);
}
QString HexSpinBox::textFromValue(int value) const
{
return QString::number(value, 16).toUpper();
}
2、在需要開(kāi)發(fā)的項(xiàng)目中的窗口中,
1、用Qt Designer創(chuàng)建一個(gè)新的窗體main.ui,把控件箱里的QSpinBox添加到窗體中。
2、右擊微調(diào)框,選擇“Promote to ”上下文菜單。
3、在彈出的對(duì)話框中,類(lèi)名處填寫(xiě)“HexSpinBox”,頭文件填寫(xiě)“hexspinbox.h”
好了。在ui生成的包含有QSpinBox的控件文件中,ui的源代碼里面多了一段
<customwidgets>
<customwidget>
<class>HSpinBox</class>
<extends>QSpinBox</extends>
<header>hspinbox.h</header>
</customwidget>
包含文件變?yōu)?hexspinbox.h"。在Qt Designer中,QSpinBox表示的控件為HexSpinBox,并且可以設(shè)置所有的QSpinBox的屬性。
可以在VS2008中編譯一下main.ui文件,從ui_main.h源代碼中可以知道,引入的控件是:
Cpp代碼  
#include <QtGui/QTableWidget>
#include <QtGui/QToolBar>
#include <QtGui/QWidget>
#include "hspinbox.h"
QT_BEGIN_NAMESPACE
class Ui_QMainClass
{
public:
QWidget *centralWidget;
QPushButton *pushButton;
QTableWidget *tableWidget;
QSpinBox *spinBox;
HSpinBox *hspinBox;
升級(jí)法的缺點(diǎn)是不能在Qt Designer中設(shè)置自定義控件自己的特有屬性,也不能夠繪制自己。這些問(wèn)題可以用插件法解決。
插件法
1.VS中創(chuàng)建Qt4 Design Plugin 工程 ,名稱(chēng)叫custom
自動(dòng)建立如下幾個(gè)文件:
自定義控件:custom.h,custom.cpp
插件:customplugin.h,customplugin.cpp
源代碼如下:
custom.h
Cpp代碼  
#ifndef CUSTOM_H
#define CUSTOM_H
#include <QtGui/QWidget>
#include "ui_test.h"
class custom : public QWidget
{
Q_OBJECT
public:
custom(QWidget *parent = 0);
~custom();
private:
Ui::Form ui;
};
#endif // CUSTOM_H
custom.cpp
Cpp代碼  
#include "custom.h"
custom::custom(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
}
custom::~custom()
{
}
customplugin.h
Cpp代碼  
#ifndef CUSTOMPLUGIN_H
#define CUSTOMPLUGIN_H
#include <QDesignerCustomWidgetInterface>
class customPlugin : public QObject, public QDesignerCustomWidgetInterface
{
Q_OBJECT
Q_INTERFACES(QDesignerCustomWidgetInterface)
public:
customPlugin(QObject *parent = 0);
bool isContainer() const;
bool isInitialized() const;
QIcon icon() const;
QString domXml() const;
QString group() const;
QString includeFile() const;
QString name() const;
QString toolTip() const;
QString whatsThis() const;
QWidget *createWidget(QWidget *parent);
void initialize(QDesignerFormEditorInterface *core);
private:
bool initialized;
};
#endif // CUSTOMPLUGIN_H
customplugin.cpp
Cpp代碼  
#include "custom.h"
#include <QtCore/QtPlugin>
#include "customplugin.h"
customPlugin::customPlugin(QObject *parent)
: QObject(parent)
{
initialized = false;
}
void customPlugin::initialize(QDesignerFormEditorInterface */*core*/)
{
if (initialized)
return;
initialized = true;
}
bool customPlugin::isInitialized() const
{
return initialized;
}
QWidget *customPlugin::createWidget(QWidget *parent)
{
return new custom(parent);
}
QString customPlugin::name() const
{
return "custom";
}
QString customPlugin::group() const
{
return "My Plugins";
}
QIcon customPlugin::icon() const
{
return QIcon();
}
QString customPlugin::toolTip() const
{
return QString();
}
QString customPlugin::whatsThis() const
{
return QString();
}
bool customPlugin::isContainer() const
{
return false;
}
QString customPlugin::domXml() const
{
return "<widget class=\"custom\" name=\"custom\">\n"
" <property name=\"geometry\">\n"
"  <rect>\n"
"   <x>0</x>\n"
"   <y>0</y>\n"
"   <width>100</width>\n"
"   <height>100</height>\n"
"  </rect>\n"
" </property>\n"
"</widget>\n";
}
QString customPlugin::includeFile() const
{
return "custom.h";
}
Q_EXPORT_PLUGIN2(custom, customPlugin)
在其cpp的最后必須 添加下面的宏:
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
Q_EXPORT_PLUGIN2(customWidgetPlugin, CustomWidgetPlugin) // 第一個(gè)參數(shù)為插件的名字,第二個(gè)是插件類(lèi)的名字(而不是自定義控件的類(lèi)名)
2.  新建后,直接編譯,會(huì)產(chǎn)生如下錯(cuò)誤
1>LINK : fatal error LNK1181: cannot open input file 'QtDesignerd.lib'
這是因?yàn)榇斯こ棠J(rèn)引用的是QtDesignerd.lib庫(kù),更改其為版本對(duì)應(yīng)的庫(kù)即可消除故障(VS2008是在項(xiàng)目的屬性中Linker/input/Additional Dependencies中修改,我這里Debug配置使用的是QtDesignerd4.lib,Release版本使用QtDesigner4.lib)。
3、使用自定義插件
1)、只需要把通過(guò)Release模式生成的  項(xiàng)目.lib和項(xiàng)目.dll文件拷到C:\Qt\4.7.4\plugins\designer中,
2)、 然后在QtDesigner中,選擇菜單Help/About Plugin就可以看到你的自定義控件是否已經(jīng)載入成功。
在QtDesigner中控件列表中有一項(xiàng)My Widget 中就有你的自定義控件。
參考:
1、 Qt自定義控件(插件)并添加到QtDesigher
打開(kāi)QtDesigner,我們自定義的空間custom成功使用界面如下:
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Qt 創(chuàng)建自定義部件并集成在 Qt Designer中
qt控件的使用
重新實(shí)現(xiàn)事件處理函數(shù)(Reimplementing Event Handlers)
自定義控件之------QProgressBar的自定義
將自定義的widget放到Qt Designer中
Qt
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服