- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个自定义存储,我想实现 ListModel
以使用 QComboBox
显示它。为简单起见,我们假设我们有一个 int
列表作为模型的数据,所以这是我对模型和测试程序的实现:
#include <QApplication>
#include <QDebug>
#include <QAbstractListModel>
#include <QComboBox>
#include <QHBoxLayout>
#include <QPushButton>
QList<int> list;
class MyModel : public QAbstractListModel
{
public:
MyModel( QWidget* parent ):
QAbstractListModel( parent )
{}
~MyModel()
{
qDebug() << __FUNCTION__;
}
QVariant data(const QModelIndex &index, int role) const
{
if ( !index.isValid() )
return QVariant();
if ( ( role == Qt::DisplayRole ) && ( index.row() < list.size() ) )
return QString::number( list.at( index.row() ) );
return QVariant();
}
int rowCount(const QModelIndex &parent) const
{
Q_UNUSED( parent )
return list.size();
}
};
int main ( int argc, char* argv[] )
{
QApplication app ( argc, argv );
QWidget w;
QHBoxLayout* l = new QHBoxLayout();
QComboBox* c = new QComboBox( &w );
c->setModel( new MyModel( c ) );
l->addWidget( c );
QPushButton* b = new QPushButton("+");
QObject::connect( b, &QPushButton::clicked, [](){
list.push_back( qrand() );
qDebug() << list;
} );
l->addWidget( b );
b = new QPushButton("-");
QObject::connect( b, &QPushButton::clicked, [](){
if ( !list.isEmpty() )
list.pop_back();
qDebug() << list;
} );
l->addWidget( b );
w.setLayout( l );
w.show();
return app.exec ();
}
如果我只点击一次按钮添加然后检查列表,它看起来没问题,但是当我再次点击它时,QComboBox
只显示第一个值和一个空行;继续添加新元素对 QComboBox
没有影响。如果我多次点击按钮添加,那么我可以在ComboBox
中看到正确的列表。
我不明白发生了什么,我做错了什么。
我在 Windows 7
上使用 Qt5.5.1
和 VS2013 x32
。
最佳答案
您的模型需要在数据实际发生变化时发出正确的信号。这通常是通过调用 protected 函数 beginInsertRows、endInsertRows 等来完成的...因为这些是 protected ,所以它们只能由 MyModel
中的成员函数调用。此外,为了良好的实践,实际数据(您的 list
)应仅由 MyModel
修改。
首先,使 list
成为 MyModel
的私有(private)成员。不应从外部访问它。
private:
QList<int> list;
在 MyModel 中添加两个用于管理 list
的公共(public)函数:
public:
void push(int value)
{
beginInsertRows(list.size(), list.size());
list.push_back(value);
endInsertRows();
}
void pop()
{
if(list.size()>0)
{
beginRemoveRows(list.size()-1, list.size()-1);
list.pop_back();
endRemoveRows();
}
}
在 main 中,在你的模型上保留一个指针
MyModel * m = new MyModel(c);
然后在 main()
中使用这些函数,而不是直接附加到 list
中。
QObject::connect( b, &QPushButton::clicked, [m](){
m->push(qrand());
} );
QObject::connect( b, &QPushButton::clicked, [m](){
m->pop();
} );
等等
替代的,更Qt的方式
将push
和pop
声明为slots
:
public slots:
void push()
{
beginInsertRows(list.size(), list.size());
list.push_back(qrand());
endInsertRows();
}
void pop()
{
if(list.size()>0)
{
beginRemoveRows(list.size()-1, list.size()-1);
list.pop_back();
endRemoveRows();
}
}
并将它们直接连接到 main 中的按钮:
QObject::connect( b, &QPushButton::clicked, m, &MyModel::push);
//...
QObject::connect( b, &QPushButton::clicked, m, &MyModel::pop);
关于c++ - 带有自定义模型的 QComboBox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34997685/
我使用 Qt Designer 来构建我的 UI 布局。在布局上,我有一个名为 cb_fac_cd 的组合框.在我的代码中,我有一个函数可以根据我尝试构建的列表自动构建一个组合框。我在数据库中定义了很
我正在创建带有复选框的 QComboBox。如何防止鼠标单击时 View 折叠?我希望能够设置复选框,但是每次单击项目时 - QComboBox 的下拉菜单都会折叠起来。 注意:目前我正在调试 Qt
我为 QComboBox 创建了模型: #ifndef QCOMBOBOXMODEL_H #define QCOMBOBOXMODEL_H #include class QComboBoxModel
我如何实现 QComboBox允许您从树结构中进行选择,类似于 QTreeView ? 最佳答案 我在 developer.nokia.com( Part 1 , Part 2 )上使用两部分配方想出
当 QComboBox 的 currentIndex 更改时,我需要使用 currentIndex+1 调用函数。今天早上我在语法上苦苦挣扎: // call function readTables(
我正在 PyQt 中开发一个应用程序,该应用程序采用对象字典,并允许您实时绘制从机器人流式传输的变量。我正在努力启用此功能的一件事是下拉菜单。不幸的是,我们有几百个变量,所以我的 PyQt Combo
我想把 QComboBox变成 QStandardItem用于 QStandardItemModel .我一直在环顾四周,我找不到答案,有什么想法吗? 最佳答案 您不存储 QComboBox在 QSt
我的 ui 上有一个 QComboBox 并像这样设置模型: QStringListModel* model = new QStringListModel; QStringList stringlis
我正在尝试在 QT5 中设置组合框的样式。我使用 QT Creator 进行布局并在启动时加载应用程序范围的样式表。 我与组合框相关的CSS如下: QComboBox { color:whit
我在输入表单上有一个可编辑组合框,其背景在接收焦点时必须更改。以下代码适用于 QLineEdit,但对 QComboBox 没有影响。 QLineEdit, QComboBox { backgroun
我想知道 QComboBox 中有多少像素需要这个项目: 红色 - 复选框 绿色 - 复选框结尾和文本开头之间的距离 蓝色 - 边框末端和复选框开始之间的距离 在 QStyle 的文档中,我找到了两种
从“正常”QCombobox开始 我想要一个 QCombobox,它仅在展开时显示图标,但在折叠时不显示。 我找到了类似问题的几个答案,但它们都显示了更复杂情况的代码,而我还没有设法提取其核心。 我见
我工作的应用程序 GUI 需要一个组合框供用户选择项目。当应用程序启动时,组合框将显示类似于“请选择”的提示文本,而不是显示组合框的第一项。我在 http://doc.qt.io/qt-5/qcomb
我想设计我的 QComboBox与下拉项目的 margin 。这是现在的样子: 我想要这样的东西: 我试过 QComboBox QAbstractItemView::item { margin
这是我的代码片段: self.cursor.execute("MATCH (n:Person) RETURN n.firstname, n.lastname") for i in self.curso
通常我会通过说将项目添加到 QCombobox: QCombobox cbb; cbb.addItem("Hello"); 但是如果我尝试这个,我会得到一个错误: QComboBox cbb; QSt
我发现在最新的 Qt 版本中(目前我使用的是 5.4.1,但在 5.2 中是一样的)如果我将几个项目添加到 QComboBox 并将鼠标光标定位在特定位置,它会自行滚动,这确实是烦人……我想。 我在
当 QComboBox 的下拉列表打开时,键盘输入被用作(不是特别聪明的)搜索元素的方式。我想禁用它并将键盘事件的处理传播到父小部件。怎么办呢?我已经尝试在子类中重新实现 keyPressEvent
我有一个数据库,其中包含两种类型的同一事物。假设我有动物,然后两种类型是鸟类和鱼类。我想要一个将两者组合在一起的组合框。所以基本上你可以选择任何动物,一些鸟或一些鱼。 在组合框中,我想显示数据库中所有
我已将 QComboBox 子类化以根据特殊需要对其进行自定义。该子类用于在 QtDesigner 的 ui 文件中提升 QComboBoxes。一切正常,除了当我在插槽中放置断点时,程序不会在断点处
我是一名优秀的程序员,十分优秀!