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