簡述
QRadioButton部件提供了一個帶有文本標簽的單選框(單選按鈕)。
QRadioButton是一個可以切換選中(checked)或未選中(unchecked)狀態的選項按鈕。單選框通常呈現給用戶一個“多選一”的選擇。也就是說,在一組單選框中,一次只能選中一個單選框。
詳細描述
單選框默認開啟自動互斥(autoExclusive)。如果啟用了自動互斥,屬於同一個父部件的單選框的行為就和屬於一個互斥按鈕組的一樣。如果你需要為屬於同一父部件的單選框設置多個互斥按鈕組,把它們加入QButtonGroup中。
每當一個按鈕切換選中或未選中狀態時,會發出的toggled()信號。如果希望每個按鈕切換狀態時觸發一個動作,連接到這個信號。使用isChecked()來查看特定按鈕是否被選中。
就像QPushButton一樣,單選框可以顯示文本,以及可選的小圖標。圖標使用setIcon()來設置,文本可以在構造函數或通過setText()來設置。可以指定快捷鍵,通過在文本中的特定字符前指定一個&。
例如:
QRadioButton *button = new QRadioButton("Search from the &cursor", this);
這個示例中,快捷鍵為Alt+c。關於更多快捷鍵的內容請參考:QShortcut 。如果要顯示一個“&”,請使用’&&’。
示例
我們來實現一個iphone中常見的開關效果 - 單選。
效果
源碼
構建單選框QRadioButton,然后將它們添加至按鈕組QButtonGroup中。
QHBoxLayout *pLayout = new QHBoxLayout();
m_pButtonGroup = new QButtonGroup(this);
// 設置互斥
m_pButtonGroup->setExclusive(true);
for (int i = 0; i < 3; ++i)
{
QRadioButton *pButton = new QRadioButton(this);
// 設置文本
pButton->setText(QString::fromLocal8Bit("切換%1").arg(i + 1));
pLayout->addWidget(pButton);
m_pButtonGroup->addButton(pButton);
}
pLayout->setSpacing(10);
pLayout->setContentsMargins(10, 10, 10, 10);
setLayout(pLayout);
// 連接信號槽
connect(m_pButtonGroup, SIGNAL(buttonClicked(QAbstractButton*)), this, SLOT(onButtonClicked(QAbstractButton*)));
槽函數,用來判斷當前點擊的按鈕,以及獲取按鈕組中各個按鈕的選中狀態。
void MainWindow::onButtonClicked(QAbstractButton *button)
{
// 當前點擊的按鈕
qDebug() << QString("Clicked Button : %1").arg(button->text());
// 遍歷按鈕,獲取選中狀態
QList<QAbstractButton*> list = m_pButtonGroup->buttons();
foreach (QAbstractButton *pButton, list)
{
QString strStatus = pButton->isChecked() ? "Checked" : "Unchecked";
qDebug() << QString("Button : %1 is %2").arg(button->text()).arg(strStatus);
}
}
樣式
單選框樣式
QRadioButton{ spacing: 2px; color: white; }
QRadioButton::indicator { width: 45px; height: 30px; }
QRadioButton::indicator:unchecked { image: url(:/Images/switchOff); }
QRadioButton::indicator:unchecked:hover { image: url(:/Images/switchOffHover); }
QRadioButton::indicator:unchecked:pressed { image: url(:/Images/switchOffPressed); }
QRadioButton::indicator:checked { image: url(:/Images/switchOn); }
QRadioButton::indicator:checked:hover { image: url(:/Images/switchOnHover); }
QRadioButton::indicator:checked:pressed { image: url(:/Images/switchOnPressed); }
上面,我們通過調用QButtonGroup的setExclusive(true)來設置按鈕組中的單選框互斥。
當然,也可以設置setExclusive(false)來關閉互斥,從而實現多選功能。即使這樣,如之前所言 - 強烈建議使用眾所周知的約定。所以,如果要實現多選功能,建議選擇QCheckBox。