pyqt закрытие пользовательского диалога в главном окне с помощью мыши - PullRequest
0 голосов
/ 28 февраля 2019

Q.Если это возможно, диалоговое окно закрывается и возвращает имя цвета только тогда, когда пользователь щелкнул или дважды щелкнул элемент цвета. Ниже приведен рабочий пример (надеюсь, чтобы продемонстрировать проблему).при нажатии на область холста появится диалоговое окно с цветом.в настоящее время пользователь должен выбрать цвет, а затем нажать кнопку «ОК», где намерение завершено, когда пользователь нажимает на цветПросто хотел сэкономить время пользователя, один бит.

import sys
from PyQt5 import QtCore, QtGui, QtWidgets, uic, QtMultimedia, QtMultimediaWidgets
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

colorsDict = { 'White': '0xFFFFFF','DarkGray': '0xA9A9A9','DarkSlateGray': '0x2F4F4F','LightSlateGray': '0x778899','DimGray': '0x696969','Gray': '0x808080','SlateGray': '0x708090','Black': '0x000000','DarkRed': '0x8B0000','Darkorange': '0xFF8C00','FireBrick': '0xB22222','Crimson': '0xDC143C','Salmon': '0xFA8072'}
def hexToQColor (h):
    h = h.lstrip('#') # general usage safety
    # h = h.lstrip('0x') # my use case
    if h.find('0x') == 0:
        h = h.split('0x')[1]
    rgb = tuple(int(h[i:i+2], 16) for i in (0, 2 ,4))
    return QColor(rgb[0],rgb[1],rgb[2])
class FfmpegColorDialog(QDialog):
    """
        Custom FFMPEG Color Picker class
    """
    resized = QtCore.pyqtSignal()
    def __init__(self, parent=None):
        super(FfmpegColorDialog, self).__init__(parent)
        # self.ui = uic.loadUi('ui/ffmpeg_colors.ui', self)
        self.setWindowTitle("FFMPEG Color Picker")
        self.listWidget = QListWidget()
        self.readPrefs()
        self.listWidget.setFlow(QListView.LeftToRight)
        self.listWidget.setResizeMode(QListView.Adjust)
        self.listWidget.setGridSize(QSize(32, 32))
        self.listWidget.setSpacing(5)
        self.listWidget.setViewMode(QListView.IconMode)
        self.listWidget.itemClicked.connect(self.itemClicked)
        self.listWidget.itemDoubleClicked.connect(self.itemDoubleClicked)
        layout = QVBoxLayout(self)
        layout.addWidget(self.listWidget)

        # OK and Cancel buttons
        buttons = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal, self)
        buttons.accepted.connect(self.accept)
        buttons.rejected.connect(self.reject)
        layout.addWidget(buttons)

    def readPrefs(self):
        """
        reading preferences from module for Data in UI
        """
        for each in colorsDict.keys():
            item = colorsDict[each]
            listItem = QListWidgetItem()
            listItem.setToolTip(each)

            listItem.setSizeHint(QSize(30, 30))
            color = hexToQColor(item)
            listItem.setBackground(QBrush(color))
            self.listWidget.addItem(listItem)
    def itemClicked(self,item):
        self.listWidget.setCurrentItem(item)
        # self.accept()
    def itemDoubleClicked(self,item):
        c = item.background().color()
        self.listWidget.setCurrentItem(item)
        result = self.exec_()
        return(c,result==QDialog.Accepted)

    def getResults(self):
        if self.exec_() == QDialog.Accepted:
            item = self.listWidget.currentItem()
            # print (item.toolTip())
            return ( item.toolTip())
        else:
            return None
    def getUserColor(self):
        return (self.listWidget.currentItem().toolTip())
    @staticmethod
    def getFinalColor(parent=None):
        dialog = FfmpegColorDialog(parent)
        result = dialog.exec_()
        color = dialog.getUserColor()
        return(color,result==QDialog.Accepted)
class MainWindow(QMainWindow):

    central_widget = None
    layout_container = None

    def __init__(self):
        super(MainWindow, self).__init__()
        self.central_widget = QWidget()
        self.layout_container = QVBoxLayout()
        self.central_widget.setLayout(self.layout_container)
        self.setCentralWidget(self.central_widget)
        self.layout_container.addWidget(GraphicsView())

class GraphicsView(QGraphicsView):

    def __init__(self):
        super(GraphicsView, self).__init__()
        self.scene = QGraphicsScene()
        self.setScene(self.scene)
        self.text = None
        self.createText()

    def createText(self):
        self.text = QGraphicsTextItem()
        font = QFont()
        font.setPixelSize(40)
        self.text.setFont(font)
        self.text.setPlainText("Sample Text To Test")
        self.scene.addItem(self.text)
    def mousePressEvent(self, event):
        r,ok = FfmpegColorDialog.getFinalColor()
        hc = colorsDict[r]
        rgb = hexToQColor(hc)
        self.text.setDefaultTextColor(rgb)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    # dia = FfmpegColorDialog()
    # dia.show()
    mw = MainWindow()
    mw.show()
    sys.exit(app.exec_())

1 Ответ

0 голосов
/ 01 марта 2019

Просто подключите сигнал щелчка QListWidget к принимающему слоту FfmpegColorDialog:

class FfmpegColorDialog(QDialog):
    """
        Custom FFMPEG Color Picker class
    """
    resized = QtCore.pyqtSignal()
    def __init__(self, parent=None):
        super(FfmpegColorDialog, self).__init__(parent)
        # ...
        self.listWidget = QListWidget()
        self.listWidget.clicked.connect(self.accept) # <---
        # ...
...