默认情况下,QTableView
双击后开始编辑单元格.如何改变这种行为.我需要它在一次点击后开始编辑.
我已将组合框委托设置为单元格.单击单元格时,它只选择它.双击单元格时,QComboBox
编辑器已激活但未展开.我希望它只需点击一下就可以扩展,就像我添加QComboBox
的setCellWidget
功能一样QTableWidget
.我使用model-view-delegate需要相同的效果.
我使用的是QSqlTableModel
和QTableView
查看SQLite数据库表.
我想让表每隔一秒自动刷新一次(它不会是一个非常大的表 - 几百行).我可以这样做 - 就像这样:
QTimer *updateInterval = new QTimer(this);
updateInterval->setInterval(1000);
updateInterval->start();
connect(updateInterval, SIGNAL(timeout()),this, SLOT(update_table()));
...
void MainWindow::update_table()
{
model->select(); //QSqlTableModel*
sqlTable->reset(); //QTableView*
}
Run Code Online (Sandbox Code Playgroud)
但是这会删除我的任何选择,因此选择只持续一秒钟.这很烦人,因为GUI中的另一个窗格取决于所选择的内容.如果未选择任何内容,则会重置为解释启动页面.
然后我尝试了一种有点hacky的方法,它获取所选的行号,重置表,然后选择该行.但这也不起作用,因为所选行可以根据对表的添加来上移或下移.
我知道其他班级都有dataChanged()
信号,这是理想的.
你们中的任何人都知道如何刷新表以反映数据库的更改(从命令行使用或程序的其他实例)并保持当前选择?
我知道我可以从当前选择中获取数据,然后在重置后搜索同一行然后重新选择它,但这似乎是一个适得其反的问题.
编辑:当前尝试解决方案:
void MainWindow::update_table()
{
QList<QModelIndex> selection = sqlTable->selectionModel()->selection().indexes();
QList<int> selectedIDs;
bool somethingSelected = true;
for(QList<QModelIndex>::iterator i = selection.begin(); i != selection.end(); ++i){
int col = i->column();
QVariant data = i->data(Qt::DisplayRole);
if(col == 0) {
selectedIDs.append(data.toInt());
}
}
if(selectedIDs.empty()) somethingSelected = false; …
Run Code Online (Sandbox Code Playgroud) 我正在使用Qt模型/视图框架.当我重置模型中的数据时,我必须重置模型以使视图也更新.怎么做?我modelReset(QPrivateSignal);
在QAbstractItemModel中找到了一个信号,这是解决它的方法吗?如何发出信号?谢谢.
我正在尝试使用新的架构组件,但我还是匕首的新手,而且我缺少了东西.
使用下面的代码,我得到一个NullPointerException,找不到位置.如果还有其他我需要修复或改进的地方,请建议.
代码: ViewModel
public class PostsVM extends ViewModel {
private LiveData<StoryPost> post;
private Repository repository;
@Inject
public PostsVM(Repository repository) {
this.repository = repository;
}
public void init() {
if (this.post != null) {
return;
}
post = repository.getPosts();
}
public LiveData<StoryPost> getPost() {
return post;
}
}
Run Code Online (Sandbox Code Playgroud)
知识库
@Singleton
public class Repository {
private final MutableLiveData<StoryPost> data = new MutableLiveData<>();
public LiveData<StoryPost> getPosts() {
//
new GetUser(post.getUid()) {
@Override
public void onSuccess(@NonNull User user) {
// this is where …
Run Code Online (Sandbox Code Playgroud) java android model-view dagger-2 android-architecture-components
该文件 https://developer.android.com/topic/libraries/architecture/viewmodel#sharing描述了如何在不同的片段之间共享相同的ViewModel。
我的页面有些复杂 单个“活动”应用程序中其中包含容器和选项卡片段。每个此类页面都有自己的ViewModel,应与所有包含的片段共享。
这里的关键技巧是使用Activity而不是Fragment来保存我的ViewModel。
问题是我的活动可以有多个具有自己的模型的页面,并且始终保持特定页面的视图模型是浪费设备资源。
当用户离开页面时,是否有任何方法可以控制ViewModel的生命周期以销毁它?
我想使用容器片段而不是活动:
model = ViewModelProviders.of(getPageContainerFragment()).get(SharedViewModel.class);
Run Code Online (Sandbox Code Playgroud)
但是发现这个想法不是很好,因为所有子片段都应该了解父元素,而这可能不是很好。
是否有其他方法可以正确处理这种情况?
android model-view android-fragments android-architecture-components android-jetpack
我想在我的程序中实现一个嵌套子级别的树,我正在寻找这两种类型中的哪一种(View/Widget)最适合我的目标.
我有一个任务日期列表,其中包括已完成/错过/失败,每个任务都计算完成/错过/失败的次数,最后是当天的分数.
我想像这样显示它们:
我在QtCreator中使用QTreeWidget做了这个例子,但是我担心修改元素很难,因为它们存储在其他地方.
我的担忧是否合理,我应该转到模型/视图结构,还是可以轻松使用QTreeWidget?树将记录任务,因此将不断变化.元素只会添加到它,而不是删除.日期将从最高 - 最低(第2天,第1天,第1天)排序
我有QVector cars
,我想根据汽车的注册号进行过滤.我想创建一个新的过滤矢量.我认为这没关系,因为我正在迭代2个向量,从第一个向量复制到第二个向量.我这样做了吗?
void MainWindow::on_actionBy_registration_number_triggered()
{
myDialog = new MyDialog(this);
myDialog->exec();
QString toSearchString = myDialog->getRegistrationNumber();
QVector<Vehicle> founded;
QVectorIterator<Vehicle> iterator(cars);
while(iterator.hasNext()){
Vehicle car = iterator.next();
QString num = car.getRegistration().getRegistrationNumber();
if(num.contains(toSearchString,Qt::CaseInsensitive)){
founded.append(car);
}
}
model = new QStandardItemModel(founded.size(),5,this);
//create header
createHeader(model);
int j = 0; //row
QVectorIterator<Vehicle> iter(founded);
while(iter.hasNext()){
Vehicle output = iter.next();
//set car
QString makeAndModel = output.getGeneralData().getMake() + output.getGeneralData().getModel();
QStandardItem *mAndM = new QStandardItem(QString(makeAndModel));
model->setItem(j,0,mAndM);
//set type
QStandardItem *type = new QStandardItem(QString(output.getGeneralData().getType()));
model->setItem(j,1,type);
//set mileage
QString mileageString = QString::number(output.getGeneralData().getMileage());
QStandardItem …
Run Code Online (Sandbox Code Playgroud) 要向模型添加新行,我正在调用beginInsertRows
和endInsertRows()
.如何配置视图以滚动到新添加的行并选择它.我可以通过发送一些信号来做到这一点,但也许Qt有标准的方式.
我正在使用一个QListView
源自的自定义模型QAbstractItemModel
.我有数百万件物品.我打电话listView->setUniformItemSizes(true)
来阻止在向模型添加项目时调用一堆布局逻辑.到目前为止,一切都按预期工作.
问题是使用键盘导航列表很慢.如果我在列表中选择一个项目,然后按向上/向下,选择将快速移动,直到选择需要滚动列表.然后变得非常迟钝.按向上翻页或向下翻页也非常滞后.问题似乎是当使用键盘选择项目(也就是"当前项目")时,列表也会向上/向下滚动.
如果我使用鼠标,导航列表很快.我可以使用快速的鼠标滚轮.我可以按照我想要的速度向上/向下拖动滚动条 - 从列表顶部到底部 - 列表视图快速更新.
关于为什么改变选择和滚动列表的组合如此缓慢的任何想法?有可行的解决方案吗?
为了更好地说明问题,我在此更新中提供了放大信息.
这主要是性能问题,尽管它确实与用户体验(UX)有关.看看当我使用键盘滚动浏览时会发生什么QListView
:
注意底部附近的减速?这是我的问题的焦点.让我解释一下我如何浏览列表.
说明:
我希望列表能够像键盘的打字速度一样快地滚动 - 换句话说,选择下一个项目所花费的时间不应该在滚动列表时减慢.
这是我使用鼠标时的样子:
说明:
这证明了两个要点:
模型不是问题.如您所见,该模型在性能方面没有任何问题.它可以比显示元素更快地传递元素.
选择和滚动时性能会降低.选择和滚动的"完美风暴"(如使用键盘在列表中导航所示)导致减速.因此,我推测,在滚动期间正常执行的选择时,Qt以某种方式进行了大量处理.
我想指出,我的问题似乎与Qt有关.
在使用不同的框架之前,我已经实现了这种类型的东西.我想做的是在模型 - 视图理论的范围内.我可以使用带有juce :: ListBox的juce :: ListBoxModel以极快的速度完成我所描述的内容.这是愚蠢的快速(此外,当每个项目已经具有唯一索引时,不需要为每个项目创建重复索引,例如a ).我认为Qt需要针对其模型 - 视图架构的每个项目,虽然我不喜欢开销成本,但我认为我理性,我可以忍受它.无论哪种方式,我都不怀疑这些因素导致我的表现减慢.QModelIndex
QModelIndex
QModelIndex
通过JUCE实现,我甚至可以使用向上翻页和向下翻页键来导航列表,它只是在列表中闪现.使用Qt QListView
实现,即使使用发布版本,它也会突然出现并且很迟钝.
我在模型视图设置中使用 RxCpp。视图更新方法订阅可观察对象(通过 lambda 捕获this
)。如果订阅的寿命比视图实例的寿命长,就会发生未定义的内存访问。我不希望订阅使视图保持活动状态。因此,我需要订阅在视图的析构函数上确定地结束。这听起来像是 RAII 的一个例子。
这有危险吗?这是否是对 rx 的滥用?我读过的书更喜欢take_until
类似的环境。为什么这样会更好,以及如何在这里使用它?
谢谢你!
#include "rxcpp/rx.hpp"
class MyView : public View
{
public:
MyView(rxcpp::observable<int> obs) : obs (obs)
{
sub = obs.subscribe ([this] (int i) { update(i); });
}
~MyView()
{
sub.unsubscribe();
}
void update(int i)
{
number = i;
repaint();
}
private:
rxcpp::observable<int> obs;
rxcpp::subscription sub;
int number;
};
Run Code Online (Sandbox Code Playgroud) model-view ×10
qt ×7
c++ ×6
android ×2
android-architecture-components ×2
qtableview ×2
dagger-2 ×1
delegates ×1
java ×1
qlistview ×1
qtreewidget ×1
raii ×1
row ×1
rxcpp ×1
treeview ×1