我今天花了一半时间尝试解决看似微不足道的QListWidget行为自定义:当使用时按下鼠标左键并移动鼠标光标,ListWidget的内容会滚动并且选择被移动到恰好出现的另一个项目在鼠标光标下。滚动时我没问题,但我想避免选择所有连续项目,因为这会导致我的程序及时运行。最后,我想在鼠标按下并移动时保持列表内容滚动,但只能通过直接单击它们来选择项目。 对此列表禁用拖放操作(这是默认行为),它应该是;我试图明确地禁用它:没有任何改变。
我已经阅读了Qt相关类的所有可用文档,如QListWidget,QListWidgetItem,QListView,你可以命名它!试图理解这些小部件的源代码;挖出了StackOverflow和Google ......但遗憾的是没有结果:(
以下是我的QListWidget的所有相关代码:单选,没什么特别的:
fontss.deriveFont(10);
C ++ / Qt 5.5如果它有某种相关性,Win和Mac平台都会有类似的行为。
答案 0 :(得分:1)
为了偶然发现同一个问题,我的解决方案是:子类QListWidget,当按下leftButton时,make子类忽略mouseMove事件。
部首:
class QtListWidget: public QListWidget
{ // QListWidget clone that suppresses item selection on mouse click+drag
private:
bool mousePressed;
public:
QtListWidget():QListWidget(), mousePressed(false) {}
protected:
virtual void mousePressEvent(QMouseEvent *event);
virtual void mouseMoveEvent(QMouseEvent *event);
virtual void mouseReleaseEvent(QMouseEvent *event);
};
来源:
//////////////////////////////////////////////////////////////////////////
void QtListWidget::mousePressEvent(QMouseEvent *event){
// qDebug() << "QtListWidget::mousePressEvent";
if(event->button() == Qt::LeftButton)
mousePressed = true;
QListWidget::mousePressEvent(event);
}
void QtListWidget::mouseMoveEvent(QMouseEvent *event){
// qDebug() << "QtListWidget::mouseMoveEvent";
if(!mousePressed) // disable click+drag
QListWidget::mouseMoveEvent(event);
}
void QtListWidget::mouseReleaseEvent(QMouseEvent *event){
// qDebug() << "QtListWidget::mouseReleaseEvent";
if(event->button() == Qt::LeftButton)
mousePressed = false;
QListWidget::mouseReleaseEvent(event);
}
//////////////////////////////////////////////////////////////////////////
对于所需数量的List Widgets,用法很简单:
QtListWidget* categoryListWidget;
// all original code above would still work as expected
...
想要做对吗?然后自己动手吧! :)
答案 1 :(得分:0)
你的解决方案让我无法滚动。我正在使用QListView。这是另一种方式:
在QListView的父级的构造函数中:
on_listview_clicked(const QModelIndex &index)
{
if (index.isValid())
{
ui->listView->selectionModel->select(index, QItemSelectionModel::Toggle | QItemSelectionModel::Rows);
}
}
在连接的插槽中:
textConnection
因此,它只会在点击时选择。