我需要瀏覽QList<QString>
和QAbstractSpinBox
。我一直在尋找indexChanged()
或類似的信號,但沒有找到它。似乎我必須在我的派生類中保存當前的索引。但是,我仍然無法找到遞增/遞減請求,也無法找到連接插槽的遞增/遞減按鈕。我錯過了什麼嗎?QAbstractSpinBox - indexChanged信號
預先感謝您。
我需要瀏覽QList<QString>
和QAbstractSpinBox
。我一直在尋找indexChanged()
或類似的信號,但沒有找到它。似乎我必須在我的派生類中保存當前的索引。但是,我仍然無法找到遞增/遞減請求,也無法找到連接插槽的遞增/遞減按鈕。我錯過了什麼嗎?QAbstractSpinBox - indexChanged信號
預先感謝您。
現在,經過我看你想做什麼,這裏是你的代碼: )。
您需要覆蓋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();
}
謝謝,看起來不錯。我明天會嘗試。 – LogicStuff 2015-05-11 20:46:32
我在Windows 8.1上用Qt 5.4.1試過了,它工作正常。我希望這對你有好處。 – 2015-05-11 20:50:04
您可以重寫事件方法,然後使用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)
我如何知道是否按下了其中一個按鈕?對不起,你還沒有告訴過我什麼。 – LogicStuff 2015-03-19 14:29:23
文檔頁面包含您需要的一切。你有什麼嘗試? – DaveyLaser 2015-03-19 16:01:49
您有使用QAbstractSpinBox而不是QSpinBox的原因嗎? – DaveyLaser 2015-03-19 16:04:26
對不起,我不明白。爲什麼你不使用QComboBox來達到這個目的? – 2015-05-11 18:55:16
@vizhanyolajos也許我可以使用'QComboBox',但是我做了一個自定義的小部件,它包含'QPushButton'和'QLineEdit',並且當我單擊這些按鈕時還會發出信號。 – LogicStuff 2015-05-11 19:18:08
好吧,我只是想幫忙,但爲此,首先我應該知道這項任務的重點是什麼?或者你找到一個好的答案? – 2015-05-11 19:28:20