qt實現 標籤控件
咱先別說啥了,直接上圖:
對照圖大體介紹一哈:
- 右邊是個輸入框,在右邊輸入內容後直接回車,就可以以標籤的形式加到前邊,每個標籤並且有自己的刪除按鈕。(對!對!對!就是這個效果!!!)
實現原理:
- 首先分析控件,將這個控件可以劃分爲以下幾個部分:①標籤控件;②輸入框;③外面的佈局窗口
①:其實就是一個窗口設置一個橫向佈局器,左邊一個label,右邊一個button
②:輸入框只要是監視回車事件
③:外面窗體佈局是重點,需要動態去更新佈局,動態有兩種:一種是將佈局銷燬,重新去new,適合修改複雜佈局的窗體;第二種就是動態的去插入(insertWidget)和刪除(removeWidget)佈局中的窗體,適合窗體佈局簡單的窗體。咱們這個控件就是一個簡單的橫向佈局,所以就動態去插入和刪除窗體。
④:其次就是使用信號和槽,將輸入框的回車和添加槽函數,標籤自身的關閉和刪除槽函數連接即可。
重點代碼
輸入框的回車處理:
if (event->type() == QEvent::KeyPress)
{
QKeyEvent *pEvent = dynamic_cast<QKeyEvent*>(event);
if (pEvent->key() == Qt::Key_Enter || pEvent->key() == Qt::Key_Return)
{
if (!m_pInputEdit->text().isEmpty())
{
//添加新標籤
addLabel(new LabelClose(this, m_pInputEdit->text()));
m_pInputEdit->setText("");
}
}
}
添加新標籤:
m_oLabelList.append(p);
m_pMainLayout->insertWidget(m_oLabelList.size() - 1, p);
connect(p, SIGNAL(closeWidget(QWidget*)), this, SLOT(childClose(QWidget*)));
刪除新標籤:
m_pMainLayout->removeWidget(self);
m_oLabelList.removeAll((LabelClose*)self);
其他也就剩一些佈局和樣式的問題了,在這就不多說了。