如題,一個界面程式有很多的pushbutton,若他們的clicked()信號都連接到同一個槽,請問這個槽在對clicked()回應的時候,如何區別是哪個pushbutton的clicked事件?或者說,我想在一個槽中,對不同button的clicked執行類似但是引數不同的操作,然而clicked是不帶引數的,請問如何這個引數該如何傳遞?謝謝各位。
uj5u.com熱心網友回復:
有兩種方法:1、使用qt中自帶的信號映射器QSignalMapper,你在百度中搜索這個類名就有簡單用法
2、你可以通過多加一層抽象來完成,通過子類化來完成,在創建BUTTON的時候通過多傳入一個引數index,并且賦給該類的私有成員,等會點擊的時候就可以根據index知道是哪個按鈕觸發的
class MyPushButton : public QPushButton
{
Q_OBJECT
public:
explicit MyPushButton(int index, QWidget *parent = 0) : QPushButton(parent), index(index)
{
connect(this, SIGNAL(clicked()), this, SLOT(OnClicked()));
}
private:
int index;
public slots:
void OnClicked(){qDebug() << index;//你可以在這里emit(index),槽函式就可以根據index知道是哪個按鈕發出的信號}
};
下面幾行是創建BUTTON的代碼
for(int i = 0; i < 3; i++)
{
MyPushButton *button = new MyPushButton(i, this);
button->setText("button" + QString::number(i));
button->move(120 * i + 10, 100);
button->show();
}
uj5u.com熱心網友回復:
1,在槽中,可以識別到信號的發送者,例如,我們把button2和button3系結到槽Test();connect(ui->pushButton_2,SIGNAL(clicked(bool)),this,SLOT(Test()));
connect(ui->pushButton_3,SIGNAL(clicked(bool)),this,SLOT(Test()));
2,然后Test這樣寫就OK了:
void MainWindow::Test()
{
qDebug()<<QObject::sender()->objectName();
}
uj5u.com熱心網友回復:
謝謝你的答案。順便問一下,自己定義的控制元件如何更好地在mainwindow上布局?一定要用layout控制元件么?能否像在QT designer里面很方便地拖動控制?我是qt新手,很多都不懂。
uj5u.com熱心網友回復:
不用layout也可以的啊,不過那樣需要考驗LZ的UI功底了,控制元件的大小,擺放,留白,背景,裝飾
uj5u.com熱心網友回復:
void GasolineWindow::on_toolButton_clicked(){
QToolButton* button=(QToolButton*)sender();
if(button==toolbuttonSet)
{
//.......................
}
else if(button==toolbuttonSave)
{
}
else if(button==toolbuttonBack)
{
}
}
uj5u.com熱心網友回復:
把按鈕加進按鈕組QButtonGroup,這樣每個按鈕就會有對應的編號,QButtonGroup點擊產生clicked(int)信號,int是按鈕的編號,
槽函式里只要switch下編號就能做對應按鈕的事件
uj5u.com熱心網友回復:
1樓、7樓答案很好,幫了我的忙。現在2019年了,給個更新。
QSignalMapper 這個類被標記為 deprecated,這里(https://zhuanlan.zhihu.com/p/62190512)和官方檔案(https://doc.qt.io/qt-5/qsignalmapper.html)都建議使用 lambda替代。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/83227.html
標籤:Qt
上一篇:trojan.android.gen是個什么木馬,功能是什么
下一篇:求大牛指導
