2015-03-18 18 views
0

我需要瀏覽QList<QString>QAbstractSpinBox。我一直在尋找indexChanged()或類似的信號,但沒有找到它。似乎我必須在我的派生類中保存當前的索引。但是,我仍然無法找到遞增/遞減請求,也無法找到連接插槽的遞增/遞減按鈕。我錯過了什麼嗎?QAbstractSpinBox - indexChanged信號

預先感謝您。

+0

對不起,我不明白。爲什麼你不使用QComboBox來達到這個目的? – 2015-05-11 18:55:16

+0

@vizhanyolajos也許我可以使用'QComboBox',但是我做了一個自定義的小部件,它包含'QPushButton'和'QLineEdit',並且當我單擊這些按鈕時還會發出信號。 – LogicStuff 2015-05-11 19:18:08

+0

好吧,我只是想幫忙,但爲此,首先我應該知道這項任務的重點是什麼?或者你找到一個好的答案? – 2015-05-11 19:28:20

回答

1

現在,經過我看你想做什麼,這裏是你的代碼: )。

您需要覆蓋virtual void stepBy(int aSteps)virtual StepEnabled stepEnabled() const函數爲您的目的。

// Header. 
#pragma once 

#include <QAbstractSpinBox> 

class StringSpinBox : public QAbstractSpinBox 
{ 
    Q_OBJECT 

public: 
    StringSpinBox(QWidget* aParent = nullptr); 
    ~StringSpinBox(); 

    void setStrings(const QStringList& aStrings); 

    virtual void stepBy(int aSteps) override; 

protected: 
    virtual StepEnabled stepEnabled() const override; 

private: 
    QStringList m_Strings; 
    int   m_CurrentIndex; 
}; 

// Source. 
#include "StringSpinBox.h" 

#include <QLineEdit> 

StringSpinBox::StringSpinBox(QWidget* aParent /*= nullptr*/) 
    : QAbstractSpinBox(aParent) 
    , m_CurrentIndex(-1) 
{ 
    lineEdit()->setReadOnly(true); 
} 

StringSpinBox::~StringSpinBox() 
{ 
} 

void StringSpinBox::setStrings(const QStringList& aStrings) 
{ 
    m_Strings  = aStrings; 
    m_CurrentIndex = 0; 

    lineEdit()->setText(m_Strings.at(m_CurrentIndex)); 
} 

// virtual override 
void StringSpinBox::stepBy(int aSteps) 
{ 
    m_CurrentIndex += aSteps; 
    m_CurrentIndex = qBound(0, m_CurrentIndex, m_Strings.size() - 1); 
    lineEdit()->setText(m_Strings.at(m_CurrentIndex)); 
} 

// protected virtual override 
QAbstractSpinBox::StepEnabled StringSpinBox::stepEnabled() const 
{ 
    StepEnabled enabled = StepUpEnabled | StepDownEnabled; 
    if (qBound(0, m_CurrentIndex, m_Strings.size() - 1) == 0) 
    { 
     enabled ^= StepDownEnabled; 
    } 
    if (qBound(0, m_CurrentIndex, m_Strings.size() - 1) == m_Strings.size() - 1) 
    { 
     enabled ^= StepUpEnabled; 
    } 
    return enabled; 
} 

// For demo purpose. 
#include "StringSpinBox.h" 

#include <QtWidgets/QApplication> 

int main(int argc, char* argv[]) 
{ 
    QApplication app(argc, argv); 

    StringSpinBox stringSpinBox; 
    stringSpinBox.setStrings(QStringList() << "Foo" << "Bar" << "Pig"); 
    stringSpinBox.show(); 

    return app.exec(); 
} 
+0

謝謝,看起來不錯。我明天會嘗試。 – LogicStuff 2015-05-11 20:46:32

+0

我在Windows 8.1上用Qt 5.4.1試過了,它工作正常。我希望這對你有好處。 – 2015-05-11 20:50:04

0

您可以重寫事件方法,然後使用lineEdit-> getText()獲取QLineEdit中的值。

喜歡的東西:

#include <QAbstractSpinBox> 
#include <QLineEdit> 
#include <iostream> 


class mySpin : public QAbstractSpinBox 
{ 

public: 

    void changeEvent(QEvent* e) override 
    { 
     QLineEdit* edit = lineEdit(); 

     //Do something with the string   
     std::cout << edit->text().toStdString() << std::endl; 
    } 
}; 

其他事件來考慮,從文檔中發現here

virtual void changeEvent (QEvent * event) 
virtual void closeEvent (QCloseEvent * event) 
virtual void contextMenuEvent (QContextMenuEvent * event) 
virtual void focusInEvent (QFocusEvent * event) 
virtual void focusOutEvent (QFocusEvent * event) 
virtual void hideEvent (QHideEvent * event) 
virtual void keyPressEvent (QKeyEvent * event) 
virtual void keyReleaseEvent (QKeyEvent * event) 
virtual void mouseMoveEvent (QMouseEvent * event) 
virtual void mousePressEvent (QMouseEvent * event) 
virtual void mouseReleaseEvent (QMouseEvent * event) 
virtual void paintEvent (QPaintEvent * event) 
virtual void resizeEvent (QResizeEvent * event) 
virtual void showEvent (QShowEvent * event) 
virtual void timerEvent (QTimerEvent * event) 
virtual void wheelEvent (QWheelEvent * event) 
+0

我如何知道是否按下了其中一個按鈕?對不起,你還沒有告訴過我什麼。 – LogicStuff 2015-03-19 14:29:23

+0

文檔頁面包含您需要的一切。你有什麼嘗試? – DaveyLaser 2015-03-19 16:01:49

+0

您有使用QAbstractSpinBox而不是QSpinBox的原因嗎? – DaveyLaser 2015-03-19 16:04:26