在Qt中移除小部件之间的细边框

5

具体而言,我有两个问题:

1)如何去除窗口部件之间的细线?已经设置了setMargin(0)和setSpacing(0)。

2)在进一步的步骤中,我想使用FramelessWindowHint删除窗口标题栏。为了拖动窗口,我将在上部暗黄色窗口上绑定一个鼠标事件。现在,上部窗口是一个QTextEdit,被抑制了键盘交互。对于拖动目的,我怀疑这个窗口部件不好...因此问题是,哪些其他窗口部件适合创建一个彩色句柄以拖动窗口?也许是QLabel?

enter image description here

编辑:这里是代码。我只使用了QTestEdit-Widgets。

from PyQt4.QtGui import *
from PyQt4 import QtGui,QtCore
import sys

class Note(QWidget):
    def __init__(self, parent = None):
        super(QWidget, self).__init__(parent)
        self.createLayout()
        self.setWindowTitle("Note")

    def createLayout(self):
        textedit = QTextEdit()
        grip = QTextEdit()
        grip.setMaximumHeight(16) #reduces the upper text widget to a height to look like a grip of a note
        grip.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) #suppresses the scroll bar that appears under a certain height
        empty = QTextEdit()
        empty.setMaximumHeight(16)
        empty.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
        resize = QTextEdit()
        resize.setMaximumHeight(16)        
        resize.setMaximumWidth(16)
        resize.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)

        layout = QVBoxLayout()
        layout.addWidget(grip)
        layout.addWidget(textedit)

        layout.setMargin(0)
        layout.setSpacing(0)

        layoutBottom=QHBoxLayout()
        layoutBottom.addWidget(empty)
        layoutBottom.addWidget(resize)
        layout.addLayout(layoutBottom)

        self.setLayout(layout)

        # Set Font
        textedit.setFont(QFont("Arial",16))

        # Set Color
        pal=QtGui.QPalette()
        rgb=QtGui.QColor(232,223,80) #Textwidget BG = yellow
        pal.setColor(QtGui.QPalette.Base,rgb)
        textc=QtGui.QColor(0,0,0) 
        pal.setColor(QtGui.QPalette.Text,textc)
        textedit.setPalette(pal)
        empty.setPalette(pal)

        pal_grip=QtGui.QPalette()
        rgb_grip = QtGui.QColor(217,207,45) 
        pal_grip.setColor(QtGui.QPalette.Base,rgb_grip)
        textc_grip=QtGui.QColor(0,0,0)
        pal.setColor(QtGui.QPalette.Text,textc_grip)
        grip.setPalette(pal_grip)
        resize.setPalette(pal_grip)

        resize.setTextInteractionFlags(QtCore.Qt.NoTextInteraction)
        empty.setTextInteractionFlags(QtCore.Qt.NoTextInteraction)
        grip.setTextInteractionFlags(QtCore.Qt.NoTextInteraction)

        #textedit.setTextInteractionFlags(QtCore.Qt.NoTextInteraction) #total text widget lock
        #textedit.setTextInteractionFlags(QtCore.Qt.TextSelectableByMouse) #Lock?
        #http://qt-project.org/doc/qt-4.8/qt.html#TextInteractionFlag-enum

        #self.setWindowFlags(QtCore.Qt.FramelessWindowHint) #removes the title bar

        #self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint) #to make the window stay on top

class Main():
    def __init__(self):
        self.notes=[]
        self.app = QApplication(sys.argv)
        self.app.setQuitOnLastWindowClosed(False);

        self.trayIcon = QSystemTrayIcon(QIcon(r"C:\Users\Thomas\Desktop\SimpleNotes.ico"), self.app)
        self.menu = QMenu()

        self.newWindow  =  self.menu.addAction("New note")
        self.separator  =  self.menu.addSeparator()
        self.hideNotes  =  self.menu.addAction("Hide all notes")
        self.showNotes  =  self.menu.addAction("Show all notes")
        self.separator  =  self.menu.addSeparator()
        self.saveNotes  =  self.menu.addAction("Save notes")
        self.loadNotes  =  self.menu.addAction("Load notes")
        self.separator  =  self.menu.addSeparator()
        self.showHelp   =  self.menu.addAction("Show help")
        self.showAbout  =  self.menu.addAction("Show about")
        self.separator  =  self.menu.addSeparator()
        self.exitAction =  self.menu.addAction("Quit notes")

        self.exitAction.triggered.connect(self.close)
        self.newWindow.triggered.connect(self.newNote)
        self.trayIcon.setContextMenu(self.menu)
        self.trayIcon.show()

        self.app.exec()

    def newNote(self):
        print("Create new note entry has been clicked")
        note=Note()
        note.show()
        self.notes.append(note)
        print(self.notes)

    def hideNotes(self):
        pass
    def showNotes(self):
        pass
    def saveNotes(self):
        pass
    def loadNotes(self):
        pass
    def showHelp(self):
        pass
    def showAbout(self):
        pass

    def close(self):
        self.trayIcon.hide()
        self.app.exit()
        print("Exit menu entry has been clicked")

if __name__ == '__main__':
    Main()

你正在使用哪些小部件和布局/容器? - Frank Osterfeld
请粘贴一些代码,以便我们能够帮助您。 - Tcz
好的,我添加了代码。我只使用了QTextWidgets。由于在Qt之前我用tkinter做笔记,所以我使用Frames作为一个处理方式...不确定Qt是否有相同的东西,因为空白帧似乎会被文本小部件推开? - user2366975
1
如果我理解你所说的“薄边框”是什么意思,你可以使用setFrameStyle函数来设置QTextEdit的边框样式。这是你想要的吗? - thuga
是的,谢谢!textedit.setFrameShape(QtGui.QFrame.NoFrame)和grip.setFrameShape(QtGui.QFrame.NoFrame)使线条消失了。至于我的第二个问题:TextEdit小部件是否适合拖动窗口,还是有其他更好的小部件? - user2366975
3个回答

7
textedit.setFrameShape(QtGui.QFrame.NoFrame)

并且。
grip.setFrameShape(QtGui.QFrame.NoFrame) 

使得这条线消失。

2

对于第一种情况,我使用了:

textEdit.setFrameStyle(QtGui.QFrame.NoFrame)

1
ui->fr200->setFrameShape(QFrame::NoFrame);
ui->fr201->setFrameShape(QFrame::NoFrame);
ui->fr202->setFrameShape(QFrame::NoFrame);
ui->fr203->setFrameShape(QFrame::NoFrame);
ui->fr204->setFrameShape(QFrame::NoFrame);
ui->fr205->setFrameShape(QFrame::NoFrame);
ui->fr206->setFrameShape(QFrame::NoFrame);
ui->fr207->setFrameShape(QFrame::NoFrame);
ui->fr208->setFrameShape(QFrame::NoFrame);

这是一个很好的通用解决方案,适用于使用C++而不是Python的人。 - David Casper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接