添加多选选择器,尝试修复插入的bug

This commit is contained in:
2020-05-11 19:58:07 +08:00
parent 06c153eb05
commit f122e69429
11 changed files with 454 additions and 28 deletions
+4 -1
View File
@@ -21,6 +21,7 @@ DISTFILES += \
FORMS += \
$$PWD/Inputter.ui \
$$PWD/MissionUI.ui \
$$PWD/Multiselector.ui \
$$PWD/Selector.ui \
$$PWD/propertyui.ui
@@ -28,6 +29,7 @@ HEADERS += \
$$PWD/Inputter.h \
$$PWD/JsonHelper.h \
$$PWD/MissionUI.h \
$$PWD/Multiselector.h \
$$PWD/Selector.h \
$$PWD/propertyui.h
@@ -35,11 +37,12 @@ SOURCES += \
$$PWD/Inputter.cpp \
$$PWD/JsonHelper.cc \
$$PWD/MissionUI.cpp \
$$PWD/Multiselector.cpp \
$$PWD/Selector.cpp \
$$PWD/propertyui.cpp
RESOURCES += \
$$PWD/inputterres.qrc
$$PWD/MissionUIres.qrc
+142
View File
@@ -0,0 +1,142 @@
#include "Multiselector.h"
#include "ui_multiselector.h"
MultiSelector::MultiSelector(QWidget *parent) :
QWidget(parent),
ui(new Ui::MultiSelector)
{
ui->setupUi(this);
//load qss
QFile file(":/qss/Selector.qss");
file.open(QFile::ReadOnly);
QTextStream filetext(&file);
QString stylesheet = filetext.readAll();
this->setStyleSheet(stylesheet);
file.close();
//因为样式表无法设置到这一层,因此手动设置
ui->listWidget->verticalScrollBar()->setStyleSheet("QScrollBar{width:60;background-color:palegoldenrod;}");
connect(ui->listWidget,SIGNAL(clicked(QModelIndex)),
this,SLOT(on_ListClicked(QModelIndex)));
connect(ui->listWidget,SIGNAL(doubleClicked(QModelIndex)),
this,SLOT(on_ListDoubleClicked(QModelIndex)));
ui->listWidget->setFocus();
ui->listWidget->setFocusPolicy(Qt::StrongFocus);
}
MultiSelector::~MultiSelector()
{
delete ui;
}
bool MultiSelector::event(QEvent *event)
{
if(event->type() == QEvent::Leave)
{
this->close();
}
return QWidget::event(event);
}
//设置分类
void MultiSelector::setCategory(QStringList list)
{
Q_UNUSED(list)
isHaveCategory = true;
}
//设置当前选中
void MultiSelector::setCurrent(QString value)
{
QList<QListWidgetItem *> items;
items = ui->listWidget->findItems(value,Qt::MatchCaseSensitive);
foreach (QListWidgetItem *item, items)
{
ui->listWidget->setItemSelected(item,true);
ui->listWidget->setCurrentItem(item);
}
ui->listWidget->setFocus();
}
//设置列表
void MultiSelector::setList(QStringList list)
{
stringmap.clear();
int32_t index = 0;
for(QStringList::const_iterator i = list.cbegin();i != list.cend();i++)
{
stringmap.insert(index,*i);
index ++;
}
reBuildList();
setCurrent(stringmap.begin().value());
}
void MultiSelector::setList(QStringList list,QString current)
{
stringmap.clear();
int32_t index = 0;
for(QStringList::const_iterator i = list.cbegin();i != list.cend();i++)
{
stringmap.insert(index,*i);
index ++;
}
reBuildList();
setCurrent(current);
}
//重建列表
void MultiSelector::reBuildList(void)
{
ui->listWidget->clear();
for (QMap<int,QString>::iterator i = stringmap.begin();i != stringmap.end(); ++i)
{
QString Item = i.value();
QWidget *widget = new QWidget(ui->listWidget);
//创建自定义的item
//将widget作为列表的item
QListWidgetItem *ITEM = new QListWidgetItem();
ITEM->setText(Item);
ITEM->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
ui->listWidget->addItem(ITEM);
ui->listWidget->setItemWidget(ITEM, widget);
}
}
//一旦点击,那么返回一个item的string
void MultiSelector::on_BtnClicked()
{
//qDebug() << "btn clicked";
}
void MultiSelector::on_ListClicked(QModelIndex index)
{
Q_UNUSED(index)
//qDebug() << "list clicked" << ui->listWidget->item(index.row())->text();
}
void MultiSelector::on_ListDoubleClicked(QModelIndex index)
{
emit confirmValue(ui->listWidget->item(index.row())->text());
this->close();
}
+71
View File
@@ -0,0 +1,71 @@
#ifndef MULTISELECTOR_H
#define MULTISELECTOR_H
#include <QWidget>
#include "QDebug"
#include "QMap"
#include "QPushButton"
#include <QModelIndex>
#include "QHBoxLayout"
#include <QMimeData>
#include <QScrollBar>
#include "QFile"
namespace Ui {
class MultiSelector;
}
class MultiSelector : public QWidget
{
Q_OBJECT
public:
explicit MultiSelector(QWidget *parent = nullptr);
~MultiSelector();
public slots:
void setCategory(QStringList list);
void setCurrent(QString value);
void setList(QStringList list);
void setList(QStringList list,QString current);
signals:
void confirmValue(QVariant);
private slots:
void on_BtnClicked();
void on_ListClicked(QModelIndex index);
void on_ListDoubleClicked(QModelIndex index);
void reBuildList(void);
protected:
bool event(QEvent *event);
private:
bool isHaveCategory = false;
private:
Ui::MultiSelector *ui;
QMap<int,QString> stringmap;
};
#endif // MULTISELECTOR_H
+39
View File
@@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MultiSelector</class>
<widget class="QWidget" name="MultiSelector">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>332</width>
<height>486</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<property name="spacing">
<number>1</number>
</property>
<item row="0" column="0">
<widget class="QListWidget" name="listWidget"/>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>
+10
View File
@@ -29,6 +29,16 @@
font: 75 20px "Arial";
}
.QPushButton#pushButton_Seq:pressed {
background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
stop: 0 #dadbde, stop: 1 #f6f7fa);
}
.QLabel {
background-color: #FFFFFF;
padding: 3px;