qt中的qwidget如何实现自定义部件_2.3信号和槽(中)
2.3.1 在ui中編輯信號(hào)槽
這一小節(jié)我們來看一下如何在ui中編輯信號(hào)槽。
我們想要在ui中實(shí)現(xiàn)點(diǎn)擊按鈕,能夠控制進(jìn)度條的顯隱。
新建GUI項(xiàng)目SignalsAndSlots2,類名SignalsAndSlots2,基類選擇QWidget。打開ui文件。在編輯界面中拖入一個(gè)Progress Bar和一個(gè)PushButton
在編輯窗口中工具欄中選擇編輯信號(hào)槽(Edit Signals/Slots)或者直接按F4。
點(diǎn)擊需要發(fā)送信號(hào)的控件PushButton,并拖動(dòng)箭頭到需要接收信號(hào)的控件Progress Bar。
此時(shí),會(huì)彈出連接窗口,勾選左下角“顯示從QWidget中繼承的信號(hào)和槽”,信號(hào)選擇toggled(bool),槽選擇setVisible(bool)。
點(diǎn)擊確定,如下圖。
再選擇工具欄中的編輯窗口(Edit Widgets)或直接按F3,選擇PushButton,修改按鈕的checkable屬性為true。checkable表示點(diǎn)擊按鈕后處于按下狀態(tài),若再點(diǎn)擊按鈕,才會(huì)彈起。checked為true,表示按鈕已經(jīng)被按下。
運(yùn)行程序,彈起按鈕,進(jìn)度條隱藏,按下按鈕,進(jìn)度條顯示。
此時(shí),我們再打開生成的ui_signalsandslots2.h文件,看到下面這行代碼:
QObject::connect(pushButton, SIGNAL(toggled(bool)), ? ? ? ? ? ? ? ? progressBar, SLOT(setVisible(bool)));我們編輯的信號(hào)槽已經(jīng)被寫到這個(gè)頭文件中了。
2.3.2 通過對象名關(guān)聯(lián)信號(hào)槽
繼續(xù)切回到ui界面,在pushButton上右擊,選擇“轉(zhuǎn)到槽...”,在彈出的對話框中選擇toggled(bool)。此時(shí),在頭文件和源文件中已經(jīng)增加了on_pushButton_toggled()函數(shù),在函數(shù)體中輸入如下代碼:
void SignalsAndSlots2::on_pushButton_toggled(bool checked){ ? ?if (checked) ? ?{ ? ? ? ?ui->pushButton->setText("隱藏進(jìn)度條"); ? ?} ? ?else ? ?{ ? ? ? ?ui->pushButton->setText("顯示進(jìn)度條"); ? ?}}我們打開ui_signalsandslots2.h文件,發(fā)現(xiàn)又多了一行
QMetaObject::connectSlotsByName(SignalsAndSlots2);由此,我們總結(jié)信號(hào)槽自動(dòng)關(guān)聯(lián)規(guī)則如下:
這樣就可以實(shí)現(xiàn)信號(hào)槽的自動(dòng)連接啦。
2.3.3 QSignalMapper
當(dāng)我們想要點(diǎn)擊一個(gè)按鈕,并且想將預(yù)先定好的參數(shù)一同發(fā)送出去時(shí),由于按鈕的點(diǎn)擊事件clicked()并沒有參數(shù),那么按照一般的做法就會(huì)先定義一個(gè)槽與clicked()信號(hào)關(guān)聯(lián),然后獲取參數(shù),再通過自定義的信號(hào)將該參數(shù)發(fā)送出去。
這個(gè)過程無疑是繁瑣的,為此,Qt提供了QSignalMapper這個(gè)類來解決這個(gè)問題。同時(shí),這個(gè)類可以連接多個(gè)按鈕,匹配發(fā)送信號(hào)的對象對應(yīng)的整數(shù)、字符串,窗口指針,繼承于QObject的對象參數(shù)重新發(fā)送它們。
現(xiàn)在我們創(chuàng)建一個(gè)類似計(jì)算器的窗口。
新建GUI項(xiàng)目SignalMapperWidget,類名SignalMapperWidget,基類選擇QWidget。在構(gòu)造函數(shù)中添加如下代碼
SignalMapperWidget::SignalMapperWidget(QWidget *parent) : ? ?QWidget(parent), ? ?ui(new Ui::SignalMapperWidget){ ? ?ui->setupUi(this); ? ?//創(chuàng)建垂直布局,將垂直布局作為主布局 ? ?QVBoxLayout* vLayout = new QVBoxLayout(this); ? ?//創(chuàng)建編輯框,用于顯示點(diǎn)擊按鈕的文字,并且文字在右邊顯示 ? ?QLineEdit* edit = new QLineEdit; ? ?edit->setAlignment(Qt::AlignRight); ? ?vLayout->addWidget(edit);//將編輯框加入到垂直布局中 ? ?//創(chuàng)建信號(hào)匹配器 ? ?QSignalMapper* signalMapper = new QSignalMapper(this); ? ?//創(chuàng)建0-9數(shù)字鍵,并都加入到網(wǎng)格布局中 ? ?QGridLayout *gridLayout = new QGridLayout; ? ?for (int i = 0; i < 10; ++i) ? ?{ ? ? ? ?QString txt = QString::number(i); ? ? ? ?QPushButton *button = new QPushButton(txt); ? ? ? ?connect(button, SIGNAL(clicked()), signalMapper, SLOT(map())); ? ? ? ?signalMapper->setMapping(button, txt);//將按鈕和要發(fā)送的字符串配對 ? ? ? ?gridLayout->addWidget(button, i / 3, i % 3);//一行顯示3列 ? ?} ? ?//連接配對信號(hào)和設(shè)置文字槽 ? ?connect(signalMapper, SIGNAL(mapped(QString)), ? ? ? ? ? ?edit, SLOT(setText(QString))); ? ?vLayout->addLayout(gridLayout); ? ?resize(200, 200);}編譯并運(yùn)行。
2.3.4 相關(guān)函數(shù)
2.3.4.1 獲取信號(hào)發(fā)送者
當(dāng)多個(gè)信號(hào)連接一個(gè)槽時(shí),有時(shí)需要判斷是哪個(gè)對象發(fā)來的,那么可以調(diào)用sender()函數(shù)獲取對象指針,返回為QObject指針。
QObject* sender() ;
2.3.4.2 解綁定信號(hào)槽
當(dāng)我們不需要信號(hào)槽連接時(shí),可使用disconnect()進(jìn)行解綁定。其寫法和connect一樣,只需要將connect換成disconnect即可。
總結(jié)
以上是生活随笔為你收集整理的qt中的qwidget如何实现自定义部件_2.3信号和槽(中)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 国内首台!国产质子治疗装置获新突破:96
- 下一篇: centos7限制cpu使用_CentO